【问题标题】:What is prototype.constructor for?prototype.constructor 是干什么用的?
【发布时间】:2013-07-26 16:24:08
【问题描述】:

继续这个question,prototype.constructor 是干什么用的?

我认为只需这样做:

new some_object()

函数对象变成了构造函数。我不明白您为什么需要以这种方式设置它。

some_object.prototype.constructor = some_object;

【问题讨论】:

  • 你不需要设置它... new 为你做的。
  • constuctor 属性用于当您收到一个对象并想知道是什么函数构造它时使用。
  • @dandavis 完全覆盖原型时需要(重新)设置它。 Foo.prototype = { ... } clobbers Foo.prototype.constructorObject
  • @apsillers :你刚才提到了一个常见的误解:constructor 是指构造函数,当你改变函数的原型时它不会改变。再次设置构造函数是没有用的。 (如有疑问,请参阅jsbin.com/iraseg/1/edit 并查看控制台结果)。

标签: javascript


【解决方案1】:

假设类 A 使用以下方法继承 B

A.prototype = new B();

在此A.prototype.constructor == B 之后。所以A 的实例有一个来自B 的构造函数。在赋值后重置构造函数是一个好习惯。

【讨论】:

    【解决方案2】:

    想象一个函数,它接受一个对象并构造一个该对象类型的新实例

    function makeNewObjectWithSameType(typedObject) {
        return new typedObject.constructor();
    }
    

    为什么您可能需要constructor 属性。

    但是constructor 在你定义你的构造函数时已经被设置了——你为什么需要再次定义它?考虑以下情况:

    function Foo() {
        // constructor logic...
    }
    Foo.prototype.constructor == Foo; // true by default
    
    var f = new Foo();
    f.constructor == Foo; // true!
    

    但现在考虑 Foo.prototype 被覆盖:

    function Foo() {
        // constructor logic...
    }
    Foo.prototype = {
        // new prototype; this is an `Object`
    }
    Foo.prototype.constructor == Foo; // FALSE! Foo.prototype is an Object
    // thus, constructor == Object
    
    var f = new Foo();
    f.constructor == Foo; // FALSE! again, this is Object
    

    如果您将f 传递给我上面的makeNewObjectWithSameType 函数,它将构造一个Object,而不是Foo

    您可以在将Foo.prototype 重新分配给新对象后手动重置Foo.prototype.constructor = Foo; 来解决此问题。

    【讨论】:

      猜你喜欢
      • 2016-01-02
      • 2012-08-12
      • 1970-01-01
      • 2016-10-30
      • 2017-11-03
      • 2014-12-20
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多