为什么我们将Child构造函数设置为自己?

时间:2017-04-24 05:17:33

标签: javascript

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

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

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

然后他们会创建一个像let dog = new Animal("FunName")

这样的新实例

然而他们会觉得需要为Dog定义一个单独的构造函数吗? 例如Dog.prototype.constructor = Dog;

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

1 个答案:

答案 0 :(得分:1)

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

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

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