apply和call
1. 每個(gè)函數(shù)都有兩個(gè)非繼承而來(lái)的方法;call和apply
2. 相同點(diǎn):設(shè)置函數(shù)體內(nèi)this的指向,以擴(kuò)展賴以運(yùn)行的作用域
一般來(lái)說(shuō),this總是指向調(diào)用某個(gè)方法的對(duì)象,它倆都是改變this的指向。
apply的實(shí)例
apply的用法
apply方法:
語(yǔ)法:apply([thisObj[,argArray]])
定義:應(yīng)用某一對(duì)象的一個(gè)方法,用另一個(gè)對(duì)象替換當(dāng)前對(duì)象。
說(shuō)明:
如果 argArray 不是一個(gè)有效的數(shù)組或者不是 arguments 對(duì)象,那么將導(dǎo)致一個(gè) TypeError。
如果沒(méi)有提供 argArray 和 thisObj 任何一個(gè)參數(shù),那么 Global 對(duì)象將被用作 thisObj, 并且無(wú)法被傳遞任何參數(shù)。
var obj = {
"a":1,
"b":2,
show:function () {
console.log(this.a)
}
}
var obj2 = {
"a":3
}
obj.show.apply(obj2);//其實(shí)相當(dāng)于obj2,繼承了obj里面的show方法,所以show里面的this指向了obj2
obj.show.apply('');//由于‘’字符串調(diào)用obj的show方法,show里面的this指向了‘’字符串
obj.show.apply(window);//this指向了window
obj.show.apply(document);//window
obj.show.apply();//默認(rèn)是指向全局的window
obj.show.apply(undefined);//指向全局的window
call方法
call方法:
語(yǔ)法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定義:調(diào)用一個(gè)對(duì)象的一個(gè)方法,以另一個(gè)對(duì)象替換當(dāng)前對(duì)象。
說(shuō)明:
call 方法可以用來(lái)代替另一個(gè)對(duì)象調(diào)用一個(gè)方法。call 方法可將一個(gè)函數(shù)的對(duì)象上下文從初始的上下文改變?yōu)橛?thisObj 指定的新對(duì)象。
如果沒(méi)有提供 thisObj 參數(shù),那么 Global 對(duì)象被用作 thisObj。
function Animate() {
this.name = 'abc';
this.type =1;
this.getName = function () {
console.log(this.name)
return this.name;
}
this.setName = function (name) {
this.name = name;
}
}
function Dog() {
this.name = 'dog';
Animate.call(this);//dog是動(dòng)物的子類;call和apply有繼承的特性,改變當(dāng)前對(duì)象的指向
//重寫(xiě)父類的方法
this.getName = function () {
console.log('&&&&&&')
console.log(this.name)
return this.name;
}
this.setName = function (name) {
this.name = name;
}
}
var dog = new Dog();
dog.setName('dog1');
dog.getName();
自我基礎(chǔ)的理解,有錯(cuò)誤歡迎指正