不推荐使用__proto__,它是非标准、已废弃的私有属性;应优先使用object.getprototypeof()和object.setprototypeof(),并用instanceof或isprototypeof()检查原型链关系。

不推荐使用 __proto__ 访问原型链,它是非标准、已废弃的私有属性,仅用于调试或兼容旧代码。现代 JavaScript 应优先使用 Object.getPrototypeOf() 和 Object.setPrototypeOf()。
为什么不该用 __proto__
__proto__ 是早期浏览器实现的非标准属性,虽被多数引擎支持,但 ECMAScript 规范从未将其纳入标准(ES6+ 明确标记为“遗留特性”)。它在严格模式下可能报错,且在某些环境(如某些嵌入式 JS 引擎或未来版本)中可能被移除。
正确获取实例的原型对象
用 Object.getPrototypeOf() 安全、标准地读取对象的原型:
const obj = { a: 1 };
console.log(Object.getPrototypeOf(obj) === Object.prototype); // true
function Foo() {}
const foo = new Foo();
console.log(Object.getPrototypeOf(foo) === Foo.prototype); // true
安全修改原型(极少需要)
若必须动态设置原型,请用 Object.setPrototypeOf(),而非赋值 __proto__:
const child = {};
const parent = { say() { return 'hi'; } };
// ✅ 推荐(标准、可预测)
Object.setPrototypeOf(child, parent);
// ❌ 避免(非标准、性能差、可能失败)
child.__proto__ = parent;
检查原型链关系的更好方式
判断一个对象是否在另一个对象的原型链上,应使用 instanceof 或 isPrototypeOf():
-
obj instanceof Constructor—— 检查Constructor.prototype是否在obj的原型链中 -
Parent.prototype.isPrototypeOf(obj)—— 直接检查指定对象是否为原型
function Animal() {}
function Dog() {}
Dog.prototype = Object.create(Animal.prototype);
const dog = new Dog();
console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
console.log(Animal.prototype.isPrototypeOf(dog)); // true
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











