遇到“方法未定义”错误时,应沿__proto__逐级检查原型链,确认方法是否正确定义在构造函数prototype上而非实例内部,排除原型被覆盖、object.create(null)截断或class中实例赋值屏蔽等问题。

遇到“方法未定义”或“xxx is not a function”错误时,原型链排查是定位根源的关键手段。核心思路是顺着 __proto__ 一层层向上检查方法是否存在,确认它是否被正确挂载在构造函数的 prototype 上,或是否被意外覆盖、遗漏。
确认实例的原型链结构
先打印实例的完整原型链,看清方法该在哪一级出现:
- 用
Object.getPrototypeOf(obj)获取当前对象的__proto__ - 反复调用直到返回
null,构成完整链条 - 配合
console.dir()查看每级原型对象上的自有属性和方法
例如:
const a = new Foo();<br>
let p = a;<br>
while (p) {<br>
console.log('→', p.constructor?.name || 'null');<br>
p = Object.getPrototypeOf(p);<br>
}
检查方法是否正确定义在 prototype 上
常见错误是把方法写在构造函数内部(变成实例私有方法),而非挂到 Foo.prototype 上:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 正确:
Foo.prototype.say = function() {} - ❌ 错误:
function Foo() { this.say = function() {} }(每个实例都新建一份,且不参与原型查找) - 验证方式:
Foo.prototype.say应为函数;typeof a.say === 'function'且a.hasOwnProperty('say') === false
留意原型链被中途截断或覆盖
以下情况会导致方法“消失”于查找路径中:
- 手动重写了
obj.__proto__或Constructor.prototype,破坏了原有继承关系 - 用了
Object.create(null)创建对象,其原型为null,不继承任何方法 - ES6 class 中误在实例上赋值同名方法(如
this.method = ...),会屏蔽原型上的同名方法
可用 Object.getPrototypeOf(a) === Foo.prototype 快速验证第一级原型是否正确。
利用 getOwnPropertyDescriptor 和 in 操作符辅助判断
区分方法是“自有”还是“继承”而来:
-
Object.getOwnPropertyDescriptor(a, 'methodName')返回undefined→ 方法不在实例自身 -
'methodName' in a为true但a.hasOwnProperty('methodName')为false→ 方法来自原型 - 再结合
Object.getPrototypeOf(a)查看该方法是否真在那一级上
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










