2015-09-07 56 views
6

MDN暗示使用.setPrototypeOf()會對您代碼的未來性能產生不良影響。setPrototypeOf對新對象的性能影響是什麼?

我還讀了一些關於爲什麼改變對象的[[Prototype]]會降低性能的問題。但沒有一個答案能夠真正解釋背景中發生了什麼。所以我想知道這是否也適用於新的對象。

特別是我真的很喜歡做這樣的事情:

var MyPrototype = { 
    method1 : function(){...}, 
    method2 : function(){...}, 
    ... 
}; 

var newObject = Object.setPrototypeOf({ 
    property : 1, 
    property2 : 'text'     
}, MyPrototype); 

可惜你不能與Object.create做到這一點,因爲它不接受一個普通的對象文本。

我使用setPrototypeOf是否也降低了執行JS引擎的性能?

+0

var newObject = Object.create(MyPrototype,{「property1」:{value:1},「property2」:{value:'text'}}); – Data

+1

我知道,但我認爲Object.create()屬性對象對於大多數情況來說太重了。我寧願只寫通常的對象文字。如果沒有帶'value'屬性的附加子對象,可以避免很多複雜性。 – Jovan

+0

所以你很熟悉[爲什麼要改變性能不好的對象的* \ [[[prototype \] \] *](http://stackoverflow.com/q/23807805/1048572)? – Bergi

回答

5

如果你擔心(因爲顯然你應該..)使用Object.setPrototypeOf()對性能的影響,但要保持你的對象創建語法類似於你的代碼是如何組織的,試試這個:

var MyPrototype = { 
    method1 : function(){...}, 
    method2 : function(){...}, 
    ... 
}; 

var newObject = Object.assign(Object.create(MyPrototype), { 
    property : 1, 
    property2 : 'text'     
}); 
+0

哦,我明白了。嗯接縫就像我錯過了這一個。看起來有點傻,因爲我們首先創建了兩個新對象,一個具有所需的屬性,但是原型錯誤,另一個沒有任何屬性,但是原型正確。然後將所有屬性從一個對象複製到另一個對象。但由於這將避免未來的性能問題,我想這是一個很好的方法。謝謝! – Jovan

+0

您可以創建一個具有正確原型的對象,另一個可以從中複製屬性。只是第二個是「浪費」,但這就是你通常將多個「命名」值傳遞給一個函數的方式。 'Object.create'使用相同的機制 – Amit

+0

是的,我知道這一點。我的意思是,我們想用一個特定的原型創建一個新對象,但爲了實現我們實際需要創建的兩個對象。我也將這種方法用於方法參數,但這裏我們只是想用它的正確原型快速設置一個新對象。但這是更好的方式去,所以沒有抱怨^^ – Jovan

0

另一種選擇是將對象文字與myPrototype的淺拷貝合併,雖然這可能不是你的願望。

var MyPrototype = { 
    method1 : function(){}, 
    method2 : function(){} 
}; 

var newObject = Object.assign({ 
    property : 1, 
    property2 : 'text'     
}, MyPrototype); 
相關問題