getOwnPropertyNames忽略Firefox上的__proto__
getOwnPropertyNames ignores __proto__ on Firefox
__proto__
是Object.prototype
:的一个属性
Object.prototype.hasOwnProperty('__proto__'); // true
但是,getOwnPropertyNames在Firefox上忽略了它:
Object.getOwnPropertyNames(Object.prototype).indexOf('__proto__'); // -1
它适用于Chromium 43和IE 11,坚固耐用。
AFAIK,根据ECMAScript 5规范,getOwnPropertyNames应该列出它:
15.2.3.4-Object.getOwnPropertyNames(O)
调用getOwnPropertyNames函数时采取步骤:
- 如果Type(O)不是Object,则抛出TypeError异常
- 设数组是通过表达式
new Array ()
创建新对象的结果,其中Array
是标准内置具有该名称的构造函数- 设n为0
- 对于O的每个命名的自己的属性P
- 设name为字符串值,该值是P的名称
- 使用参数ToString(n)调用数组的[[DefineOwnProperty]]内部方法,PropertyDescriptor{[[Value]]:name、[[Writable]]:true、[[Enumerable]]:true、[Configuration]]:true[/strong>}和false
- 将n增加1
- 返回数组
__proto__
是Object.prototype
的已命名own属性(否则,hasOwnProperty将返回false,因为[[GetOwnProperty]]将返回undefined)。因此,它应该由getOwnPropertyNames列出,不是吗?
ECMAScript 6中的情况应该有所不同吗?ES6草案确实改变了一些事情:
19.1.2.7-Object.getOwnPropertyNames(O)
调用getOwnPropertyNames函数时采取步骤:
- 返回GetOwnPropertyKeys(O,字符串)
19.1.2.8.1-运行时语义:GetOwnPropertyKeys(O,Type)
使用参数O调用抽象操作GetOwnPropertyKeys和Type,其中O是Object,Type为ECMAScript之一规范类型字符串或符号。采取以下步骤:
- 设obj为ToObject(O)
- ReturnIfAbrupt(对象)
- 设键为对象。[OwnPropertyKeys]
- ReturnIfAbrupt(键)
- 让nameList成为一个新的空列表
- 按列表顺序对keys的nextKey中的每个元素重复上述操作,
- 如果Type(nextKey)为Type,则
- 将nextKey附加为nameList的最后一个元素
- 返回CreateArrayFromList(nameList)
9.1.12-[[OwnPropertyKeys]]()
当O的[[OwnPropertyKeys]]内部方法被调用时采取以下步骤:
- 让键成为一个新的空列表
- 对于O的每个属性键P,它是一个整数索引,按数字索引升序排列
- 添加P作为键的最后一个元素
- 对于O的每个自己的属性键P,它是字符串但不是整数索引,按属性创建顺序
- 添加P作为键的最后一个元素
- 对于属于Symbol的O的每个属性键P,按属性创建顺序
- 添加P作为键的最后一个元素
- 返回键
[[OwnPropertyKeys]]应返回包含"__proto__"
的列表,GetOwnPropertyKeys应返回具有"__proto__"
的数组,因为其类型应为String。
即使是Symbol而不是String(这没有多大意义),getOwnPropertySymbols也应该包括__proto__
,但它返回一个空数组。
所以,这是一个bug,还是这里应用了什么复杂的规范?
是的,这似乎是一个错误。从这个错误报告(观察到类似的奇怪情况):
我们在没有[[Prototype]],因为我们不想把它暴露在网络上。或者在至少这是当时的意图,尤其是因为没有其他浏览器以这种方式公开了Object.prototype上的属性是杀死__原__的机会。我仍然有一些希望__质子可以被杀死,我自己;其他人不同意。
他们需要为ES6修复此问题。
- 如何使用jQuery自动打开页面上的所有链接
- 如何使Javascript动态html表及其上的事件
- 对iPad上的点击事件反应缓慢
- 偶尔结结巴巴地说“;堆叠的”;translate()上的转换(v4.0.0-alpha40)
- 设置滑块分区上的滚动
- Html页面上的多个Base64图像和平滑加载
- 如何确定javascript已经完成了某些操作.ios上的
- 如何从画布上的某个移动事件中获取X和Y
- JsFiddle上的鼠标事件不起作用
- delete关键字在全局变量上的不同行为
- 用Javascript更改我网站上的字体大小
- 激活chrome上的chrome.notifications对象
- 单击页面上的链接后高度发生变化
- 用与线条相同的颜色填充多折线图上的点
- Meteor上的启动页面
- 主体上的addEventListener('mousemove',..)-有多糟糕
- 检查onsubmit doenst work jquery contactform上的函数
- 使用数据上的角度更改设置集合的第一个元素的动画
- Safari(Mac OS)上的jQuery平滑滚动问题
- 锚点元素不't使用svg时,请打开EDGE上的href