遇到“对象没有某个方法”报错时,应沿原型链逐级追溯:先确认对象类型和方法名,再用__proto__或object.getprototypeof()向上检查各层原型是否含该方法,验证其是否为可访问函数,并检验原型链连通性。

当遇到“对象没有某个方法”的报错时,不是直接改代码,而是顺着原型链一层层看它“该从哪儿继承”,才能准确定位问题根源。关键不是猜,是查。
先确认方法调用的对象和目标方法名
比如 arr.myPush() 报错,先明确两点:当前对象 arr 是什么类型(数组)、想调用的方法名是 myPush。这一步避免把拼写错误、大小写混淆当成原型链问题。
手动沿 __proto__ 或 Object.getPrototypeOf() 向上追溯
在控制台中逐级打印原型,观察方法是否存在:
-
arr.__proto__→ 看是否含myPush(数组实例的原型是Array.prototype) -
Object.getPrototypeOf(arr).__proto__→ 即Array.prototype.__proto__,也就是Object.prototype,再查一遍 - 继续向上:如果还没找到,就到
Object.prototype.__proto__ === null,链终止
这样能清晰看到哪一层该有却没挂载,或哪一层被意外覆盖/丢失。
检查原型对象是否真的包含该方法
不能只看有没有属性名,还要确认它是函数且可访问:
- 用
typeof arr.__proto__.myPush === 'function'验证类型 - 注意不可枚举性:
Object.keys(Array.prototype)不会显示push(因默认不可枚举),但Object.getOwnPropertyNames(Array.prototype)可以 - 若方法是后来添加的(如
Array.prototype.myPush = ...),要确认执行时机是否早于调用——常见于模块加载顺序问题
验证原型链连通性,排除断裂可能
有时原型被显式重写导致链断开,可用以下方式快速检验:
-
Array.prototype.isPrototypeOf(arr)→ 应返回true;若为false,说明arr的原型没连到Array.prototype -
arr instanceof Array→ 若为false,大概率原型链异常(如用Object.create(null)创建对象后强行赋值) - 检查是否误改了
constructor.prototype或直接赋值了obj.__proto__,破坏了默认委托关系
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











