将 属性 添加到实例或添加到原型 属性 之间有什么区别?

What are the difference between adding a property to instance or adding to prototypeproperty?

我有以下 class:

      class PersonCl {
      constructor(fullName, age) {
        this.fullName = fullName;
        this.age= age;
      }
    
      // Instance methods
      // Methods will be added to .prototype property
      calcAge() {
        console.log(2037 - this.birthYear);
      }
    
      greet() {
        console.log(`Hey ${this.fullName}`);
      }
}

现在我可以说两个从构造函数创建的对象:

const Joe = new PersonCl('Joe',23);
const Larisa = new PersonCl('Larisa',41);

我问的是:

有什么区别

1.adding 将 属性 species 放入构造函数中,并将其准确设置在我们设置全名和年龄的位置。

  1. 或在 class 声明外添加以下行:

    PersonCl.prototype.species = "男";

放置在原型对象上的“物种”属性将在most中的所有实例中可见(但不是all 情况)。一旦您的代码对“物种”进行了更改:

someInstance.species = "tiger";

那么那个实例就会有一个本地属性“物种”,其他实例上的“物种”的值不会改变。

显然,当 属性 直接添加到构造函数中的实例时,所有实例都将被类似地初始化(给定您的示例代码),但此后仍可以逐个实例进行更改.关键点是更新一个对象的 属性 值总是使该对象成为本地的、“自己的”属性,并且不会影响原型。

一些旨在帮助将对象属性作为集合处理的方法,例如 Object.keys() 涉及“自己的”属性,这意味着与对象直接关联的属性而不是继承的属性。

  1. 原型是一个真实的对象
  2. 很多对象可以有相同的原型
  3. 原型也可以有原型
  4. 当你读取object 属性时,JS会先找自己的属性,如果不存在,就会在prototype和prototype的prototype中找这个属性等