将 属性 添加到实例或添加到原型 属性 之间有什么区别?
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 放入构造函数中,并将其准确设置在我们设置全名和年龄的位置。
或在 class 声明外添加以下行:
PersonCl.prototype.species = "男";
放置在原型对象上的“物种”属性将在most中的所有实例中可见(但不是all 情况)。一旦您的代码对“物种”进行了更改:
someInstance.species = "tiger";
那么那个实例就会有一个本地属性“物种”,其他实例上的“物种”的值不会改变。
显然,当 属性 直接添加到构造函数中的实例时,所有实例都将被类似地初始化(给定您的示例代码),但此后仍可以逐个实例进行更改.关键点是更新一个对象的 属性 值总是使该对象成为本地的、“自己的”属性,并且不会影响原型。
一些旨在帮助将对象属性作为集合处理的方法,例如 Object.keys()
、仅 涉及“自己的”属性,这意味着与对象直接关联的属性而不是继承的属性。
- 原型是一个真实的对象
- 很多对象可以有相同的原型
- 原型也可以有原型
- 当你读取object 属性时,JS会先找自己的属性,如果不存在,就会在prototype和prototype的prototype中找这个属性等
我有以下 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 放入构造函数中,并将其准确设置在我们设置全名和年龄的位置。
或在 class 声明外添加以下行:
PersonCl.prototype.species = "男";
放置在原型对象上的“物种”属性将在most中的所有实例中可见(但不是all 情况)。一旦您的代码对“物种”进行了更改:
someInstance.species = "tiger";
那么那个实例就会有一个本地属性“物种”,其他实例上的“物种”的值不会改变。
显然,当 属性 直接添加到构造函数中的实例时,所有实例都将被类似地初始化(给定您的示例代码),但此后仍可以逐个实例进行更改.关键点是更新一个对象的 属性 值总是使该对象成为本地的、“自己的”属性,并且不会影响原型。
一些旨在帮助将对象属性作为集合处理的方法,例如 Object.keys()
、仅 涉及“自己的”属性,这意味着与对象直接关联的属性而不是继承的属性。
- 原型是一个真实的对象
- 很多对象可以有相同的原型
- 原型也可以有原型
- 当你读取object 属性时,JS会先找自己的属性,如果不存在,就会在prototype和prototype的prototype中找这个属性等