原型链式访问本质是javascript引擎按需向上查找属性:先查自身,再沿[[prototype]]逐级向上,直至null;手动构建需让child.prototype=new parent()并修复constructor,避免直接赋值parent.prototype以防共享和干扰。

原型继承的链式访问逻辑,本质是 JavaScript 引擎按需向上查找属性或方法的过程:先查自身,找不到就顺着 [[Prototype]] 一直往上找,直到找到或抵达 null。
链式访问的核心机制
每次访问对象属性(如 obj.method())时,引擎执行的是“委托式查找”:
- 第一步:检查
obj自身是否拥有该属性(自有属性) - 第二步:如果没有,就读取
obj.__proto(即Object.getPrototypeOf(obj)),在该对象上查找 - 第三步:仍没有,继续读取这个原型对象的
__proto,重复查找 - 最终到达
Object.prototype,它的[[Prototype]]是null,链终止
如何手动构建可链式访问的原型关系
关键在于让子构造函数的 prototype 指向父构造函数的实例,从而形成有效链接:
- 定义父类:确保方法写在
Parent.prototype上,而不是构造函数内部 - 设置继承:用
Child.prototype = new Parent(),使子类原型成为父类实例 - 修复构造器:补上
Child.prototype.constructor = Child,避免 constructor 指向错误 - 新增方法:后续给
Child.prototype添加的方法,会自动出现在所有子实例的原型链中
为什么不能直接赋值 Child.prototype = Parent.prototype
这样做会让子类和父类共享同一原型对象,导致:
- 修改
Child.prototype会意外影响Parent.prototype - 子类无法独立扩展自己的原型方法而不干扰父类
- 实例的
instanceof判断可能失效(因为原型引用完全相同)
验证链式访问是否生效
可通过以下方式确认查找路径是否正确:
- 用
obj.hasOwnProperty('prop')区分属性是否为自有 - 用
'prop' in obj判断是否在整条原型链上存在 - 用
Object.getPrototypeOf(obj)逐层打印原型,观察是否连通到Parent.prototype和Object.prototype











