我们知道JavaScript具有原型继承而不是古典继承,这意味着每个对象具有[[Prototype]]属性,可用于通过原型链进行继承。
然而,我无法理解的原型继承模型的一部分是默认的原型属性背后的逻辑,该默认原型属性是函数(或类)对象最初获得的。即
//For classes
class Dog {}
Dog.prototype // {constructor: Dog}
//For functions
function Cat() {}
Cat.prototype // {constructor: Cat};
使该属性包含指向函数本身的构造函数有什么用?我了解一种用法,即如果定义以某种方式丢失(例如这样),则任何创建的对象都将获得构造函数属性,并可用于创建其他对象:
function Dog(name) {
this.name = name;
alert(name);
}
let dog = new Dog("White Dog");
let dog2 = new dog.constructor("Black Dog");
但是这并不能证明这种设置实在是一件非常复杂的事情(因为函数/类是唯一具有这种对自身的循环引用的对象)。这个决定背后还有其他原因吗?
[力量来自被用作new
运算符的所有实例的[[prototype]]的对象:
const mydog = new Dog("White Dog");
console.assert(Object.getPrototypeOf(mydog) === Dog.prototype)
这是您的类的中心对象,所有共享方法都位于该类中。其中的.constructor
property仅是一个有用的(.constructor
)默认值。但是你会写
if rarely used
并且该方法将可以通过继承作为
Dog.prototype.woof = function() {
alert(this.name + "says: Woof!");
};
使用dog.woof();
语法定义方法将导致相同的class
对象。