原型链查找不改变原型对象,但查找过程中对原型的修改会实时影响所有依赖该原型的对象;添加或修改属性立即生效,删除属性则跳过查找;重写prototype会断开已有实例连接,需避免全量替换。

原型链查找本身不改变原型对象,但你在查找过程中对原型做的修改,会实时影响后续所有依赖该原型的对象——前提是没切断原型连接。
原型的动态性:添加或修改属性立即生效
只要没重写整个 prototype,在原型上增、改方法或属性,所有已有实例都能立刻使用。这是因为实例通过 [[Prototype]] 指针引用原型,不是拷贝。
- 先创建实例,再往
Person.prototype加sayHi(),实例仍能调用 - 修改
Person.prototype.name = "Tom",所有未覆盖该属性的实例读取时都会得到新值 - 删除原型上的属性(
delete Person.prototype.age),后续查找就会跳过它,继续向上
重写 prototype 是危险操作:会断开已有实例连接
用赋值方式完全替换 prototype(如 Person.prototype = { ... }),会导致之前创建的实例仍指向旧原型,而新实例指向新原型——两者不再共享同一套方法和属性。
- 已有实例调用新原型上的方法会报
undefined或is not a function - 必须手动修复
constructor,否则instance.constructor指向Object - 若需重写,建议在创建任何实例前完成;否则改用
Object.setPrototypeOf()或Object.assign()增量更新
查找过程中的“遮蔽”与删除行为
实例自身拥有同名属性时,会屏蔽原型链上的同名属性——这叫属性遮蔽。删除实例属性后,查找自动回落到原型。
立即学习“Java免费学习笔记(深入)”;
-
person.name = "Alice"→person.name读取的是实例值 -
delete person.name→ 再读person.name就去Person.prototype找 - 但
delete Person.prototype.name会让所有未定义name的实例读取结果变为undefined
避免意外中断:推荐的安全修改方式
想安全扩展原型,优先选择增量操作,避开全量重写。
- 用
Object.assign(Person.prototype, { method1(), method2() })合并新方法 - 用
Object.defineProperty()精确控制属性的可枚举性、可写性 - 需要继承时,用
Object.create(Parent.prototype)构建子类原型,保留正确链接 - 调试时可用
Object.getPrototypeOf(obj)确认当前指向,别依赖已废弃的__proto__


















