没有new或Object.create的原型继承

时间:2013-04-17 09:29:56

标签: javascript inheritance prototype-programming

是否有任何方法可以在不使用new的情况下使对象继承原型(1),并且 (2)不使用Object.create。 (我怀疑Object.create方法中存在new,但是在Firebug控制台告诉我它是本机代码之后,好吧,我怀疑它是原生的。)当我说“继承原型”时我意味着真正的 JavaScript原型继承(即,不仅仅是模仿它)。当我看到它时,我知道真正的继承(即,__proto__属性存在,构造函数和原型之间存在循环引用,存在继承层次结构。)

我的问题归结为:即使'我们几乎没有新的',只有两种继承机制newObject.create

4 个答案:

答案 0 :(得分:2)

  

[...]是继承newObject.create的唯一两种机制?

是的,他们是。至少那些是你应该使用的。

可以直接分配给__proto__,但它不是标准属性还是。更多信息:MDN - __proto__

答案 1 :(得分:1)

您可能知道newObject.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