我有一个问题问你
据我所知,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();
}
我开始创建很多对象并对它们进行原型设计,但是多次需要初始化它的属性我.init()
对它们做了一个方法
var base = {
init: function() {
EmitterMixin.call(this);
return this;
}
};
var obj = Object.create(base).init();
this
但是,当然,我必须记住总是从那里回来,.init()
而且很多时候我都忘记了,或者最糟糕的是,我忘了打电话.init()
。因此,为了简化对象初始化,我想创建一个全局帮助器来完成它:invoke Object.create
,调用初始化函数并返回它。
function create(proto) {
var child = Object.create(proto);
child.init();
return child;
}
然后当我意识到我正在做的实际上是new
操作员所做的事情时,我想用头撞墙,但要慢得多。如果 polifill 适用,我什至会new
在引擎盖下使用。
所以我问自己,投掷有什么好处new
?它在主要浏览器上明显更快,并且由于 javascript 的性质,我们通常需要调用一个 initualizer 函数,而不是new
从一开始就做的事情。
最糟糕的是,我注意到比我使用两种不同类型的对象,“抽象”和“实例”,更大的区别是我必须调用的实例,.init()
而抽象是不必要的,因为它们只会被用来其他对象的原型。而且我在使用时已经看到了这种模式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
?