【问题标题】:Do __proto__ and Object.getPrototype of expose exactly the same functionality?__proto__ 和 Object.getPrototype 是否公开完全相同的功能?
【发布时间】:2016-03-17 13:07:16
【问题描述】:

ES2015 中__proto__ 的标准化是否会否定Object.getPrototypeOf 的需要?

【问题讨论】:

  • 这个问题不是更适合programmers.stackexchange.com吗?
  • 我的问题是:__proto__Object.getPrototype 是否公开完全相同的功能?
  • @CodingGorilla 在引用其他网站时,指出cross-posting is frowned upon 通常会有所帮助
  • @gnat 我不是建议交叉发布,我是建议将其从 SO 中删除并重新发布给程序员,它似乎更适合此类问题。

标签: javascript ecmascript-6


【解决方案1】:

__proto__Object.getPrototype 是否公开完全相同的功能?

没有。 .__proto__ 仅适用于从 Object.prototype 继承的对象。而Object.getPrototype 不允许修改原型。

__proto__ 在 ES2015 中的标准化是否否定了对Object.getPrototypeOf 的需求?

你把它弄反了。 ES5 Object.getPrototypeOf 和 ES6 Object.setPrototypeOf 完全不需要使用 __proto__

Object.prototype.__proto__ 访问器属性仅在 ES6 中标准化,以实现需要它的实现之间的向后兼容性和互操作性。它被明确标记为网络遗留功能。检查note on Annex B ("...遗留功能 [for] 基于 Web 浏览器的 ECMAScript 实现。[它们] 具有 [...] 不受欢迎的特性,并且 [...] 将被大量 [如果不使用] 从本规范中删除现有的网页 […]。程序员在编写新的 ECMAScript 代码时不应使用或假设存在 [它们]。不鼓励 ECMAScript 实现实现这些功能。")

【讨论】:

  • 您似乎说永远不需要使用__proto__。您的附件 B 报价以及 MDN 在MDN proto 的警告支持您的立场。但是,同一页面显示了良好的移动浏览器支持,而MDN getPrototypeOf 显示了移动浏览器支持的问号。所以如果一个项目需要移动浏览器支持,在这种情况下使用__proto__不是更好吗?
  • @Marcus 否。最好使用Object.getPrototypeOf polyfill(使用__proto__ 实现)来支持旧浏览器。顺便说一句,问号的意思是“没有人找到支持的最早版本并将其输入表格”,而不是“不好的支持”。我什至会质疑那里一致的“是”,肯定一些早期的移动浏览器没有实现__proto__。在任何情况下,每个 ES5 引擎都支持 Object.getPrototypeOf,无论如何,在旧的 (ES3) 引擎中你会遇到很多其他问题。
  • 我不得不说,我喜欢我们可以轻松地写const a = {}; const b = { __proto__: a }。我希望它不会被弃用。 :)
  • @trusktr const b = Object.setPrototypeOf({}, a)const b = Object.assign(Object.create(a), {}) 并没有那么糟糕。曾经还有一个proposal for a prototype operatorconst b = a <| {}
猜你喜欢
  • 1970-01-01
  • 2014-03-29
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2015-08-09
  • 2020-03-25
  • 1970-01-01
相关资源
最近更新 更多