我有一個問題要問你我們真的必須改爲Object.create嗎?
據我所知,new
運營商以這種方式工作
function fakeNew(Ctor) {
var instance = Object.create(Ctor.prototype);
instance.constructor();
// I skip the conditional for simplicity
return instance;
}
這一切開始的時候我做了一個Object.create
polifill這樣我就可以不使用new
創建對象。
Object.create = function(proto) {
function F() { }
F.prototype = proto;
return new F();
}
我開始創建大量objcts和prototiping他們,但很多次話,需要initializa其屬性我做了一個.init()
方法把它們
var base = {
init: function() {
EmitterMixin.call(this);
return this;
}
};
var obj = Object.create(base).init();
但當然,我不得不rembember返回this
總是從.init()
多次我忘記它或最差,我忘了撥.init()
。所以試圖簡化對象初始化,我想創建一個全局幫助器來執行它:調用Object.create
,調用初始化函數並返回它。
function create(proto) {
var child = Object.create(proto);
child.init();
return child;
}
當時,當我想打我的頭靠在牆上,當我意識到我在做什麼幾乎被什麼new
符不,但慢了很多。而如果polifill適用,我甚至會使用new
。
所以我問自己,扔什麼好處new
?它在主要瀏覽器上爲notably quicker,並且由於JavaScript的性質,我們通常需要調用一個啓動器函數,而不是new
開始啓動。
而且最糟糕的,我發現比我用了兩個不同類型的對象的,「抽象」和「實例」,更大的區別是比情況下,我不得不調用.init()
,同時附有摘要它不是necesasary因爲他們只會被用作其他物體的原型。我已經看到了在使用new
這個模式:
function Foo() { }
Foo.prototype.method = function() { ... };
function Bar() { }
// "abstract" doesnt invoke initializer
Bar.prototype = Object.create(Foo.prototype);
Bar.prototype.other = function() { ... };
// "instance", the constructor is called as initializer
var obj = new Bar();
是否真的有益處,如果我們再看到new
?我們確定它不是一個更高級別的工具,而是簡化我們必須做的事情嗎? 你看到new
和Object.create
有什麼優點/缺點?
Main [反對'new'的參數](http:// stackoverflow.com/questions/383402/is-javascript-s-new-keyword-considered-harmful)是「被遺忘時會造成多大的傷害」,以及「基於類的繼承太多」 – Bergi