2017-01-16 46 views
0

讀取從谷歌顯影劑見解的摘錄:在原型與值型實例變量 https://developers.google.com/speed/articles/optimizing-javascript#initializing-instance-variables在JavaScript中,爲什麼要將具有引用類型的實例變量放入構造函數中?


地點實例變量聲明/初始化(而不是引用類型)初始化值(即,類型號值,布爾值,null,未定義或字符串)。這樣可以避免在每次調用構造函數時不必要地運行初始化代碼。 (這不能用於實例變量,它的初始值取決於參數給構造,或一些其它狀態在施工時間來完成。)

對於實施例,代替:

foo.Bar = function() { 
    this.prop1_ = 4; 
    this.prop2_ = true; 
    this.prop3_ = []; 
    this.prop4_ = 'blah'; 
}; 

用途:

foo.Bar = function() { 
    this.prop3_ = []; 
}; 

foo.Bar.prototype.prop1_ = 4; 

foo.Bar.prototype.prop2_ = true; 

foo.Bar.prototype.prop4_ = 'blah'; 

我明白LOGI c將變量的值類型放入函數原型中,但是當我們有像this這樣的引用變量時,我們是不是運行初始化代碼。 (按照Google的例子)?這是不是每次調用構造函數都會創建一個新的數組?

+0

「這不是每次調用構造函數都創建一個新數組嗎?」 - 它確實,這是重點。 – user2357112

+0

沒有「引用類型」或「值類型」。有效的語言類型列在[* ECMA-262§6.1*](http://ecma-international.org/ecma-262/7.0/index.html#sec-ecmascript-language-types)中。變量具有一個值,該值可能是一個[*原始值*](http://ecma-international.org/ecma-262/7.0/index.html#sec-primitive-value)或*參考*(又名[*參考規格類型*](http://ecma-international.org/ecma-262/7.0/index.html#sec-reference-specification-type))。 – RobG

回答

1

引用類型的實例屬性需要添加到否則當加入到原型的構造,該構造的對象的每個實例將共享相同的參考。只需閱讀信息即可,但在學習時會出現問題。請檢查下面的例子

var Test = function() { 
    this.foo = []; 
}; 

Test.prototype.bar = []; 

var instance1 = new Test(); 
var instance2 = new Test(); 

instance1.foo.push(1); 
instance1.bar.push(1); 
instance2.foo.push(2); 
instance2.bar.push(2); 

console.log(instance1.foo, instance1.bar); // [1], [1,2] 

雖然instance1.bar.push被調用一次,該陣列具有兩個值,因爲instance1.barinstance2.bar是相同的陣列中,由兩個對象共享。

相關問題