0

我知道 Crockford 有一个著名的 JavaScript 继承对象函数:

function object(o) {
    function F() {}
    F.prototype = o;
    return new F();
}

但我很困惑,在 line 之后F.prototype = o,他为什么不重置F.prototype's 构造函数,如下所示:

F.prototype.constructor = F

这不是常见的做法吗?

4

2 回答 2

1

这不是常见的做法吗?

仅当您创建子类时(具有从其他原型继承的原型的构造函数)。

但这不是这段代码的目的,它基本上是Object.create. 它负责创建从另一个对象继承的对象,仅此而已。构造F函数只是中间的,不应该暴露。

F.prototype = o;

他为什么不这样做F.prototype.constructor = F

因为那会改变o自己。目的只是创建一个新对象。请注意,它返回的是中间构造函数的实例,而不是构造函数本身。


将在哪里constructor设置(如果需要)?在由 实例化的对象上object

 function inherit(chd, par) {
     chd.prototype = object(par.prototype);
     chd.prototype.constructor = chd;
 }

 function Foo() {}
 function Bar() {}
 inherit(Foo, Bar);

 /* Because of overwriting `constructor`: */
 Foo.prototype.constructor === Foo
 (new Foo).constructor === Foo

 /* Because of the prototype chain: */
 new Foo instanceof Bar // true, because
 Foo.prototype instanceof Bar // true
于 2013-08-05T09:41:08.077 回答
0

由于您使用的F是原型对象本身的实例,因此设置constructor属性没有任何好处。

例如:

function Foo() {}
function Bar() {}

Bar.prototype = object(Foo.prototype);
Bar.prototype.constructor = Bar;

所以现在Bar.prototypeF. 我们将constructor属性分配给该实例,该实例将隐藏constructor分配给的属性F.prototype。那么,为什么要首先分配它呢?

一般来说,该属性在 JavaScript 中没有意义,但在您自己的代码constructor中可能很有用。即您的代码可能取决于. 但在函数中,它只是一个临时构造函数,只是复制 的功能,这在较新的浏览器中受支持。我想不出您希望在代码中引用的用例。constructorobjectFobjectObject.createF

于 2013-08-05T09:00:34.200 回答