是否有任何方法可以在不使用new
的情况下使对象继承原型(1),并且
(2)不使用Object.create
。 (我怀疑Object.create
方法中存在new,但是在Firebug控制台告诉我它是本机代码之后,好吧,我怀疑它是原生的。)当我说“继承原型”时我意味着真正的 JavaScript原型继承(即,不仅仅是模仿它)。当我看到它时,我知道真正的继承(即,__proto__
属性存在,构造函数和原型之间存在循环引用,存在继承层次结构。)
我的问题归结为:即使'我们几乎没有新的',只有两种继承机制new
和Object.create
?
答案 0 :(得分:2)
[...]是继承
new
和Object.create
的唯一两种机制?
是的,他们是。至少那些是你应该使用的。
你可以直接分配给__proto__
,但它不是标准属性还是。更多信息:MDN - __proto__
。
答案 1 :(得分:1)
您可能知道new
和Object.create
执行的隐藏操作比我们可以调用setPrototype
。
Object.create = function(proto, properties) {
var obj = {};
setPrototype(obj, proto);
Object.defineProperties(obj, properties);
return obj;
}
function fakeNew(Constructor) {
var obj = {};
setPrototype(obj, Constructor.prototype);
Constructor.call(obj);
return obj;
}
它不是“new在Object.create中”或“Object.create在new里面”。两者都进行原型分配和其他操作。
实际上有一种方法可以实现setPrototype
,但你肯定知道它不是标准的。
function setPrototype(obj, proto) {
obj.__proto__ = proto;
}
答案 2 :(得分:0)
为了避免使用new
运算符,但仍然实例化一个继承自原型的对象(SomeClass
的原型),一个简单的解决方案是构建一个Facade构造函数(使用它)幕后的new
操作员:
function SomeClassFacade() {
return new SomeClass();
}
SomeClass.prototype = {
/* ... */
};
答案 3 :(得分:0)
从ES6开始,您还可以使用Reflect.construct
,其基本上与new
运算符类似:
function Constructor() {}
var instance = Reflect.construct(Constructor, []);
Object.getPrototypeOf(instance); // Constructor.prototype
如果你想要更接近Object.create
的东西,ES6扩展类也可以创建继承,但只能来自构造函数或null
:
var obj = (class extends null{}).prototype;
delete obj.constructor;
Object.getPrototypeOf(obj); // null
function Constructor() {}
var obj = (class extends Constructor{}).prototype;
delete obj.constructor;
Object.getPrototypeOf(obj); // Constructor.prototype