HLJ 发布于
2025-06-11 10:26:12
1阅读

JavaScript 原型方法:没有 __proto__ 的对象

上一篇文章:

JavaScript 原型系统

下一篇文章:

JavaScript Class 基本语法

JavaScript 原型方法:没有 __proto__ 的对象

在 JavaScript 中,虽然 __proto__ 是一个常见的访问对象原型的属性,但它并不是标准化的方法。现代 JavaScript 提供了更标准的方式来处理原型,特别是对于没有 __proto__ 属性的对象。

标准原型方法

  1. Object.getPrototypeOf()

    • 获取对象的原型
    • 替代 obj.__proto__
      const obj = {};
      const proto = Object.getPrototypeOf(obj);
      
  2. Object.setPrototypeOf()

    • 设置对象的原型
    • 替代 obj.__proto__ = newProto
      const obj = {};
      const newProto = { method() {} };
      Object.setPrototypeOf(obj, newProto);
      

创建没有 __proto__ 的对象

  1. Object.create(null)

    • 创建一个真正没有原型的对象(没有继承任何属性,包括 __proto__
      const bareObj = Object.create(null);
      console.log(bareObj.toString); // undefined
      console.log('__proto__' in bareObj); // false
      
  2. 使用 null 原型

    • 这种对象被称为"字典对象",适合用作纯粹的键值存储

为什么避免使用 __proto__

  1. __proto__ 不是 ECMAScript 标准的一部分(虽然在附录中为了兼容性被提及)
  2. 在某些环境下可能不可用(如严格模式下的某些情况)
  3. 性能考虑 - 直接原型操作可能影响 JavaScript 引擎的优化

示例:安全地处理原型

// 创建无原型对象
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__ 操作。

当前文章内容为原创转载请注明出处:http://www.good1230.com/detail/2025-06-11/818.html
最后生成于 2025-06-13 20:53:22
上一篇文章:

JavaScript 原型系统

下一篇文章:

JavaScript Class 基本语法

此内容有帮助 ?
0