之前寫的文章感覺好幼稚,原因是這幾個月我又提高了不少。
之前的文章就別看了,自己也不想看:),但是是我的成長的一段經歷。
今天談談javascript 的 call() 和 apply()方法的認識。
首先,他們是什麼東西?(不是罵他們哦)
他們是Function.prototype的方法。
如何理解他們的用法呢?
foo.call(this, arg1,arg2,arg3)
== foo.apply(this, arguments)
== this.foo(arg1, arg2, arg3)
這只是去理解它們的用法
this.foo()肯定調不到foo方法,因爲this裏面可能根本沒有去設置foo這個方法,這個foo其實是人家的foo,this很喜歡這個方法,想去偷過來自己用。那就喊call和apply兩兄弟去偷。
this怎麼理解呢?
var abc = function(a, b){
return a + b
}
var Abc = function(){
this.name = 'abc',
this.age = 11,
this.sum = function(){
return window.abc.call(this, 1, 2)
}
}
var a = new Abc();
alert(a.sum()) //自己試
無中生有是不是很賤。。
至於爲什麼要寫window.abc呢?
爲什麼呢?
既然你可以從window家裏偷abc,當然也可以去其他家裏偷abc啊!!
演示一遍
var ABc = function(){
this.sum = function(a, b){
return a + b
}
}
var b = new ABc();
var Abc = function(){
this.name = 'abc',
this.age = 11,
this.sum = function(){
return b.sum.call(this, 1, 2)
}
}
var a = new Abc();
alert(a.sum())
爲什麼ABc要先實例化呢??
因爲你不實例化,他不算一個對象。而call 和apply 相當於是Function.prototype的一個方法。這個怎麼理解呢?什麼是Function.prototype?
var ABc = function(){
this.sum = function(a, b){
return a + b
}
}
ABc.prototype = {
init: function(a, b){
return '參數是' + a + b
}
}
var b = new ABc();
var Abc = function(){
this.name = 'abc',
this.age = 11,
this.sum = function(){
return b.init.call(this, 1, 2)
}
}
var a = new Abc();
alert(a.sum())
而call 和 apply 相當於ABc後臺已經定義好了的方法。
ABc.prototype.call = function(){…}
prototype 什麼意思呢? 這個不知道的話暫時就不解釋了。
就是所有的實例化對象都能用到的屬性。就像共產主義,這裏定義的東西大家都能用,免費用。只要你是共產主義者。只要你是這個構造函數的實例化對象。
至於call 和 apply的差別呢?
就是參數的差別。一看就明白了。
如果傳的參數數量固定可以用call,如果不固定就用apply唄。
寫的可能有問題,或者寫的不全,這個也是自己的一個暫時的認知,希望夥伴們能多多指出。