__proto__
的对象在 JavaScript 中,虽然 __proto__
是一个常见的访问对象原型的属性,但它并不是标准化的方法。现代 JavaScript 提供了更标准的方式来处理原型,特别是对于没有 __proto__
属性的对象。
Object.getPrototypeOf()
obj.__proto__
const obj = {};
const proto = Object.getPrototypeOf(obj);
Object.setPrototypeOf()
obj.__proto__ = newProto
const obj = {};
const newProto = { method() {} };
Object.setPrototypeOf(obj, newProto);
__proto__
的对象Object.create(null)
__proto__
)const bareObj = Object.create(null);
console.log(bareObj.toString); // undefined
console.log('__proto__' in bareObj); // false
使用 null 原型
__proto__
__proto__
不是 ECMAScript 标准的一部分(虽然在附录中为了兼容性被提及)// 创建无原型对象
const dict = Object.create(null);
dict.key = 'value';
// 安全地获取原型
function getPrototype(obj) {
if (Object.getPrototypeOf) {
return Object.getPrototypeOf(obj);
}
// 回退方案(不推荐)
return obj.__proto__;
}
// 检查对象是否有原型
function hasPrototype(obj) {
return Object.getPrototypeOf(obj) !== null;
}
现代 JavaScript 开发中,推荐始终使用 Object.getPrototypeOf()
和 Object.setPrototypeOf()
来替代 __proto__
操作。