【问题标题】:Why Object.prototype.__proto__ === null为什么 Object.prototype.__proto__ === null
【发布时间】:2013-08-23 22:07:04
【问题描述】:

在 JavaScript 非标准属性 __proto__ 和函数 Object.getPrototypeOf(...) 中返回内部属性 [[Prototype]]。

对于所有函数,“prototype”属性是 Object.prototype 的一个实例,例如:

Array.prototype instanceof Object//true

但 Object.prototype 并非如此:

Object.prototype.__proto__ === null //true
Object.getPrototypeOf( Object.prototype ) === null //true

mozilla developer documentation 只说:

对象的 proto 属性引用与其相同的对象 内部 [[Prototype]](通常称为“原型”),其中 可以是一个对象,或者在默认情况下 Object.prototype.proto, null .

Object.prototype.proto 或失败的 Object.getPrototypeOf (Object.prototype) 返回 Object.prototype 会更合适吗?

这是一个错误吗?这个可以吗?为什么?

【问题讨论】:

  • 你为什么会这样?
  • [[GetProperty]] 的第 4 步永远不会成立,因此寻找不存在的属性会导致 Object.prototype 无限循环。该步骤测试空原型,表示原型链的顶部;如果没有null 原型,则链以循环结束。

标签: javascript ecmascript-5


【解决方案1】:

虽然Object.prototype.__proto__ 现在在大多数浏览器中都受支持,但它的存在和确切行为仅在 ECMAScript 2015 规范中作为遗留功能进行了标准化,以确保与 Web 浏览器的兼容性。为了获得更好的支持,请改用 Object.getPrototypeOf()。

链接:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto

【讨论】:

    【解决方案2】:

    原型链必须在某处停止。

    如果有Object.getPrototypeOf( Object.prototype ) === Object.prototype,JS 引擎会在尝试从原型中解析某些内容时进入无限循环。

    它会沿着原型链向上走到Object.prototype,如果在那里找不到它,它会再次向上走到Object.prototype无限

    事实上,如果你自己尝试这样做,你会得到一个错误:

    > Object.prototype.__proto__ = Object.prototype
    Error: Cyclic __proto__ value
    

    请注意,您也可以通过调用Object.create(null) 创建自己的不带[[Prototype]] 的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2012-12-06
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      相关资源
      最近更新 更多