Javascript 为什么要将子构造函数设置为它们自己?

Javascript 为什么要将子构造函数设置为它们自己?,javascript,Javascript,在JavaScript、培训教程等中,您将拥有一个对象原型。例如: function Animal(name) { this.name = name; speak: function() { console.log("Yummy!"); } } 然后他们将创建一个新实例,如solet dog=new Animal(“FunName”) 然而,他们会觉得有必要为Dog定义一个单独的构造函数? 例如Dog.prototype.constructor=Dog

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

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

    speak: function() {
       console.log("Yummy!");
    }
}
然后他们将创建一个新实例,如so
let dog=new Animal(“FunName”)

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


这样做的“意义”到底是什么

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

如果您继续使用Javascript中的oops,您将意识到某些属性是继承的,而其他属性不是继承的,这是因为继承的属性是在prototype属性上定义的(您可以称之为子命名空间)-也就是说,以Object.prototype开头的属性。,而不是那些只以对象开头的。prototype属性的值是一个对象,它基本上是一个存储桶,用于存储我们希望由prototype链下游的对象继承的属性和方法

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