我有一个问题要问你我们真的必须改为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