【问题标题】:Why do we set Child constructors to themselves? [duplicate]为什么我们将 Child 构造函数设置为自己? [复制]
【发布时间】:2017-09-20 16:11:12
【问题描述】:

在 JavaScript 中,在培训教程等中,您将拥有一个对象原型。如:

function Animal(name) {
    this.name = name;

    speak: function() {
       console.log("Yummy!");
    }
}

然后他们会像let dog = new Animal("FunName")这样创建一个新实例

但是他们会觉得有必要为 Dog 定义一个单独的构造函数吗? 比如Dog.prototype.constructor = Dog;

这样做的“重点”究竟是什么?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    JavaScript 是一种基于原型的语言——每个对象都有一个原型对象,它充当模板对象,从中继承方法和属性。一个对象的原型对象也可能有一个原型对象,它从它继承方法和属性,等等。这通常被称为原型链,并解释了为什么不同的对象具有定义在其他可用对象上的属性和方法。 属性和方法是在对象的构造函数上定义的,而不是对象实例本身。 在经典的 OOP 中,定义了类,然后在创建对象实例时,将类上定义的所有属性和方法复制到实例中。 在 JavaScript 中,它们不会被复制过来——而是在对象实例和它的构造函数之间建立一个链接(原型链中的一个链接),并且在构造函数中通过遍历链找到属性和方法。

    如果您继续在 Javascript 中使用 oops,您会发现某些属性是继承的,而其他属性不是,这是因为继承的属性是 在原型属性上定义的(您可以将其称为sub namespace) — 即以 Object.prototype. 开头的那些,而不是仅以 Object.prototype 开头的那些。原型属性的值是一个对象,它基本上是一个存储桶,用于存储我们希望被原型链下游的对象继承的属性和方法。

    因此,如果您希望能够正确访问所有数据成员和函数,则应遵循显式定义构造函数,否则您将无法访问少数函数和数据成员。

    【讨论】:

      猜你喜欢
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多