2016-12-27 36 views
4

1)調用JavaScript調用鏈構造爲對象

var obj = {num:2}; 

var add = function(a){ 
    return this.num + a; 
}; 

add.call(obj, 1); //function.call(obj, arg) 

2)調用鏈構造爲一個對象。

var Product = function (name, price) { 
    this.name = name; 
    this.price = price; 
} 

var Food = function(name, price) { 
    Product.call(this, name, price); // <-- 1. Product is obj constructor not fun 
            //  2. what is 'this' here? 
    this.category = 'food'; 
} 

var cheese = new Food('feta', 5); 

console.dir(cheese); 

我目前研究的JavaScript接力,我發現了一個例子約Function.prototype.call()鏈構造函數,但我不明白它是如何工作的。

1)是否需要調用函數調用obj?但產品是構造。

var food = { category : 'food' }; 

var Product = function (name, price) { 
    this.name = name; 
    this.price = price; 
} 

var cheese = Product.call(food); 
console.dir(cheese);//this will become undefine 

2)'this'是什麼?食物對象? Product.call(new Food, name, price);

*最終結果var cheese將是一個對象,Product.call(new Food obj, name, price)

產品仍然是一個函數,所以結果成爲一個對象?

+0

'this'將指向'Food' – Rajesh

+0

其真正混淆,因爲食品是一個構造函數,我們創建了一個新的食品對象,裏面含有叫 –

+0

我越來越混淆這些,我們有函數,方法和Constructor,什麼是類的功能? –

回答

4

兩個產品食品用作構造函數,這意味着什麼比它們的功能,它們可以用new被稱爲(但不一定要)多。 食品構造函數使用產品擴展用new Food(...)創建的對象。

這是理解至關重要的是,當你調用與new一個功能,一個新的,空的對象被創建,提供給該功能this。在該函數中,您可以添加屬性。另外,如果一個函數中沒有return語句,它將在返回一個對象時調用new:它是構造的對象,在該函數中被稱爲this

一些魔術發生有:

Product.call(this, name, price); // <-- 1. Product is construct not fun 

通常你會打電話產品這樣的:

new Product(name, price) 

...但是,創建並返回一個新的對象。但是,這裏的目的是擴展new Food(...)創建的對象。後一個對象是this。因此,您不必執行new Product(...)(它創建另一個新對象),而是將已存在的對象(this)傳遞給它。您可以使用.call(),這是第一個參數的上下文 - this產品函數執行期間的對象。

請注意,在這種情況下,.call返回undefined,因爲該函數未用new調用,所以返回值將是函數返回值的任何明確返回值。由於產品中沒有return聲明,因此它將返回undefined。但是這裏沒有興趣,因爲我們只看到函數調用對第一個參數的副作用:this獲取分配給它的屬性。

所以產品食品功能都得到屬性添加到相同對象。當食品new Food()返回時,您將有一個對象,即instanceof食品

注意,有來實現繼承幾種方法,做的這種方式它有一些缺點,包括:其是

  • 生成的對象不被視爲instanceof產品
  • 性質在Product.prototype上定義的對象將不可用於使用new Food()創建的對象。
+0

從第一個示例中,var add是一個函數,但是第二個示例var Product不是一個函數,如何使用'call'? 'call'應該是function.call(object) –

+0

Product是一個函數。無論你編寫'function Product(){...'或'var Product = function(){...',它都是一個函數。即使它沒有明確地返回一個值,當你用'new'調用它時也是如此。而使用Product.call則不使用返回值,而是使用第一個參數(上下文)的副作用是重要的。 – trincot

+0

我們稱爲新食品,但我們不叫新產品,1。如果我們稱新產品,產品將是對象(我們不能把obj.call(obj)),2.如果它的功能,新食品('feta ',5);應該不是對象,那是什麼使我迷惑 –