2014-04-08 63 views
0

上MDN的page for Call有3個構造函數的例子:產品,食品,玩具和這兩個構造函數在JavaScript中有什麼區別?

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

    if (price < 0) 
     throw RangeError('Cannot create product "' + name + '" with a negative price'); 
    return this; 
} 

function Food(name, price) { 
    Product.call(this, name, price); 
    this.category = 'food'; 
} 
Food.prototype = Object.create(Product.prototype); 

爲什麼需要這條線?

Food.prototype = Object.create(Product.prototype); 

難道我不能簡單地這樣做嗎?

function Food (name, price) { 
    var me = Product.call(this, name, price); 
    me.category = 'food'; 
    return me; 
} 
+0

不會對糧食情況出現。這可能是一件好事,取決於你的需求。是的,有很多方法來設置這種事情,他們都有微小的差異。使用適合你的東西。 – dandavis

+0

@dandavis你說的是真的。你可以把它作爲答案嗎? – tholapz

回答

1

一個區別是語法。在我看來,第一個片段更好。

基本上這樣的:

Food.prototype = Object.create(Product.prototype); 

,後來這個

Toy.prototype = Object.create(Product.prototype); 

意味着它們共享相同的原型產品,這是很好的。但是在你向我們展示的例子中,他們並沒有真正利用這個概念,這個概念在JavaScript中並不真正存在,但是它必須是必須的語言(比如PHP)。

你可以有功能或屬性僅連接到一個玩具或食物:

Food.prototype = Object.create(Product.prototype); 
Food.prototype.eat = function(){ //Toy object can't call that function 
    alert('Om Nom Nom') 
} 

你當然可以這樣做,以及:

function Food (name, price) { 
    var me = Product.call(this, name, price); 
    me.category = 'food'; 
    me.eat = function(){ 
     alert('Om Nom Nom'); 
    }; 
    return me; 
} 

但是,這會導致不必要的內存使用情況和可能會影響性能。

最後,使用instanceof將是錯誤的。隨着第二種方法,你將無法知道,如果你的對象是產品:

//Method1 
alert(foodObj instanceof Food); //true 
alert(foodObj instanceof Product); //true 

//Method2 
alert(foodObj instanceof Food); //true 
alert(foodObj instanceof Product); //false 

Live example

在你的「簡單」選項,後初始化更改產品的原型
+0

用於調出instanceof的+1。但是,我使用node.js並嘗試驗證您的結果。這是我得到: [code snippet](https://gist.github.com/tholapz/10160289) – tholapz

+0

@ user3349705我是事半功倍的事情。用「簡單」,你就失去了對「產品」的提及,而不是「食品」。至於你的例子,你們中的一個對象是'Food2',所以'instanceof Food'返回false,在答案的最後看到小提琴! –

+0

我發現我的錯誤是檢查instanceof Food而不是Food2。但是,對象的名稱意味着什麼? – tholapz

1

不同的是,你的對象Food不會繼承的Product原型方法。它返回看起來像是Product的實例,但有差異。

相關問題