javascript 中实例通过原型链访问原型对象,具体做法是当读取实例属性时,引擎先在实例自身查找,未找到则沿 __proto__ 指向的 [[prototype]] 继续向上搜索,直到找到或到达 null。这意味着实例可以直接获取原型上定义的方法或属性,且这种访问是动态的,修改原型会影响所有已存在的实例。

如何验证实例与原型之间的链接关系
可以通过 Object.getPrototypeOf() 方法或 instanceof 操作符来验证实例与原型的关系。前者直接返回实例的原型对象,后者检查构造函数的 prototype 是否出现在实例的原型链上。这两种方式都能确认实例确实能访问到原型上的内容。

function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
return `Hello, ${this.name}`;
};
const p1 = new Person('Alice');
console.log(Object.getPrototypeOf(p1) === Person.prototype); // true
console.log(p1 instanceof Person); // true
console.log(p1.sayHello()); // Hello, Alice
原型链断裂或覆盖时的访问行为
如果在实例上定义了与原型同名的属性,实例将优先访问自身的属性,从而“遮蔽”原型上的同名属性。这种行为不会破坏原型链,只是属性查找在第一步就停止了。若要恢复对原型的访问,需删除实例上的该属性或使用 delete 操作符。

function Person(name) {
this.name = name;
}
Person.prototype.greet = 'Hi';
const p1 = new Person('Bob');
p1.greet = 'Hey'; // 遮蔽原型属性
console.log(p1.greet); // Hey (实例属性)
delete p1.greet; // 删除实例属性
console.log(p1.greet); // Hi (回到原型属性)
基于构造函数 prototype 属性的具体影响
构造函数的 prototype 属性决定了新创建实例的原型对象。如果直接替换整个 prototype 对象,之前创建的实例不会受到影响,因为它们已经绑定了旧的原型对象。只有在新实例化时才会使用新的原型对象。这要求开发者在修改原型时要小心,避免意外切断已有实例的功能。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











