从原型继承 vs 从构造函数继承

inherit from prototype vs inherit from constructor

我正在搜索 Object.create 的更多信息。我发现了一个 this 用户已经提出的问题。在接受的答案中,他们正在谈论像

这样的继承

Object.create 构建一个直接继承自作为第一个参数传递的对象的对象。

var o = new SomeConstructor();

上面的例子中,o直接继承自SomeConstructor.prototype

现在我只想知道从 prototype 继承的意思是什么,以及它与直接从构造函数继承

实际上有什么区别

Object.create

的解释

当你做这样的事情时:

var obj = Object.create( baseMethods );

obj.ownMethod = function () {
  console.log( 'baz' );
};

var baseMethods = {
  method1: function () {
    console.log( 'something' );
  },
  method2: function () {
    console.log( 'foobar' );
  }
};

每当 JavaScript 引擎找不到 属性 obj。例如,如果您调用:

obj.method1(); // will log 'something'

JavaScript 引擎将首先尝试在 obj 上查找 属性。由于无法在 obj 上找到 属性,它将 委托 对其 原型对象 的查找(我们已经使用 Object.create) 定义了。在这种情况下,原型对象是 baseMethod。现在已经找到 属性,引擎将执行 method1.

Constructor.prototype

的解释

在您的代码中,您有:

var o = new SomeConstructor();

SomeConstructor 视为具有类似于我的 baseMethods 对象的对象,其中 SomeConstructor 的实例将首先查找实例本身的属性,然后 delegate 如果找不到 属性 则添加到该对象。在您的示例中, SomeConstructor 实例将委托给的对象恰好是 SomeConstructor.prototype.

看着你的问题,请不要误以为 o 继承自 SomeConstructor - 正确的想法是 o 委托它对一个对象的对象查找恰好是SomeConstructor函数对象上的属性(即SomeConstructor.prototype