面试题答案
一键面试- 代码实现:
function Person() {
this.newAge = this.age + 5;
}
Person.prototype.age = 0;
const p1 = new Person();
const p2 = new Person();
p1.age = 10;
-
p2.newAge
的值:p2.newAge
的值为5
。 -
赋值操作符在原型链相关场景下的工作机制解释:
- 当创建
Person
的实例时,例如p1 = new Person()
和p2 = new Person()
,在构造函数Person
内部执行this.newAge = this.age + 5
。此时,this.age
会首先在实例对象上查找,由于实例对象刚开始并没有age
属性,所以会沿着原型链向上查找,找到Person.prototype.age
,其值为0
。所以this.newAge
被赋值为0 + 5 = 5
。 - 当在
p1
上修改age
属性值为10
时,这只是在p1
这个实例对象上创建了一个新的age
属性,并赋值为10
,这个操作并不会影响p2
实例。因为p2
实例的newAge
属性值是在创建p2
实例时,基于当时原型链上age
的值(0
)计算得到并赋值的,之后p1
实例对age
属性的修改不会影响到p2
实例已经确定的newAge
值。每个实例的属性查找和赋值是相对独立的,除非通过原型对象进行修改,才会影响到所有基于该原型创建的实例。
- 当创建