5

有什么方法可以使对象从原型继承(1)不使用new,(2)不使用Object.create。(我怀疑 new 存在于Object.create方法中,但在 Firebug 控制台告诉我它是本机代码之后,我怀疑它是本机代码。)当我说“从原型继承”时,我指的是真正的JavaScript 原型继承(即,不仅仅是模仿它)。当我看到它时我就知道真正的继承(即__proto__属性存在,构造函数和原型之间存在循环引用,存在继承层次结构)。

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

4

4 回答 4

2

[...] 是仅有的两种继承机制newObject.create?

对,他们是。至少这些是您应该使用的唯一。

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

于 2013-04-17T09:32:59.487 回答
2

正如您可能知道的那样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;
}
于 2013-04-17T13:50:01.080 回答
0

为了避免使用new操作符,但仍然实例化一个继承自原型的对象(的原型SomeClass),一个简单的解决方案是构建一个外观构造函数(它new在幕后使用操作符):

function SomeClassFacade() {
  return new SomeClass();
}

SomeClass.prototype = {
 /* ... */
};
于 2016-09-04T12:24:26.363 回答
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
于 2016-09-04T12:39:04.227 回答