2014-01-08 107 views
1

在下面的代碼中,我有一個名爲Foo的類,我添加了一個名爲data的原型,它是一個數組,我添加了一個名爲showData的函數作爲類的原型。關於JavaScript中的原型概念

var Foo = function (name) 
{ 
    this.name = name; 
}; 
Foo.prototype.data = [1, 2, 3]; // setting a non-primitive property 
Foo.prototype.showData = function() 
{ 
    console.log(this.name, this.data); 
}; 

的問題是,是否有區別,如果我定義數據和showData Foo類裏面爲:

var Foo = function (name) 
    { 
     this.name = name; 
     this.data = [1, 2, 3]; 
     this.showData = function() 
     { 
      console.log(this.name, this.data); 
     }; 
    }; 
+0

'console.log(Foo)'並比較差異! :) – Phil

回答

4

是的,有一個重大的區別。

在第一種情況下,data陣列由Foo的所有實例共享。所以,如果你修改一個實例的屬性,所有被修改:

var f1 = new Foo(), 
    f2 = new Foo(); 
f2.data[2] = 4; // also changes f1.data 

它也消耗更少的內存,由於這種共享,但是這可能不是你的關心,如果除了您創建的Foo很多情況下(注意,在JS,就像在使用gc的語言中經常使用內存一樣,不僅因爲內存消耗而損壞,而且因爲CPU被用於垃圾回收)。

但屬性設置爲prototype是棘手的,因爲搜索總是從childest元素開始:如果設置f2.data = [1,2,4],那麼你改變f2.data但你不改變f1.data(這將產生2個不同的陣列)。

1

主要區別在於,通過向原型添加屬性,即可將它們添加到Foo的所有實例,即使是已創建的實例。

你的第二版本還包括執行的每一個new Foo被實例化時間碼那些附加線,其可以是開銷的一個潛在的巨大