call 和 apply 的認識

之前寫的文章感覺好幼稚,原因是這幾個月我又提高了不少。
之前的文章就別看了,自己也不想看:),但是是我的成長的一段經歷。

今天談談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唄。

寫的可能有問題,或者寫的不全,這個也是自己的一個暫時的認知,希望夥伴們能多多指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章