Javascript:函数/类的原型属性的默认值背后的逻辑是什么?

问题描述 投票:0回答:1

我们知道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");

但是这并不能证明这种设置实在是一件非常复杂的事情(因为函数/类是唯一具有这种对自身的循环引用的对象)。这个决定背后还有其他原因吗?

javascript function inheritance prototype
1个回答
0
投票

[力量来自被用作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对象。

© www.soinside.com 2019 - 2024. All rights reserved.