[英]Is crockford's JavaScript constructor pattern really supposed to be faster?
您的測試之間的主要區別是:
{}
比new Object
快 ,這表明new
比使用{}
慢。 ( []
和new Array
也是如此。)
您的測試會產生不同的結果: make
工廠函數的結果不是Make
對象。 構造的Make
有一個原型,由所有Make
對象共享。 您的工廠函數的結果只是一個裸Object
,並且在其原型鏈( Object.prototype
)中有一個原型,而Make構造的對象有兩個( Make.prototype
,后跟Object.prototype
)。
我使用非標准的__proto__
屬性實現了一個實際返回Make
對象(而不是簡單的Object
)的工廠函數的測試分支 ,它比使用構造函數慢得多。 IE不支持__proto__
,但Firefox和Chrome的結果看起來非常明確。
構造函數優化的一個方面是共享屬性,通常是方法。 如果許多對象使用與方法相同的函數,或者共享其他命名屬性,那么對原型的一個賦值將在從構造函數創建的所有對象中共享該屬性的單個實例,從而減少內存開銷,並且不需要重復為每個創建的對象分配每個這樣的屬性,減少了構建時間開銷。
由於您的樣本不包含任何此類屬性,因此您不會看到此類好處。 但是,如果您的生產代碼不包含構造對象的共享屬性,則可能沒有理由切換到構造函數。
所以,如果,例如你有代碼這樣的 :
function make(p) {
return {
parm: p,
addTwo: function() {return this.parm + 2;},
double: function() {return this.parm * 2;},
square: function() {return this.parm * this.parm;}
};
};
它可能比這更慢:
function Make(p) {
this.parm = p;
}
Make.prototype.addTwo = function() {return this.parm + 2;};
Make.prototype.double = function() {return this.parm * 2;}
Make.prototype.square = function() {return this.parm * this.parm;}
如果您創建許多實例,它還會占用更多內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.