为什么本机数据类型属性没有显示在相应的原型上?

时间:2013-05-20 09:25:38

标签: javascript prototype

例如,Array数据类型有一个名为pop()的函数,我想这是使用以下函数添加的:

Array.prototype.pop = function(){ /* ... */ };

但据我所知,使其不可枚举的唯一方法是做这样的事情:

Object.defineProperty(Array.prototype, "pop", { enumerable: false });

所有浏览器都不支持。

Array.prototype.doSomething= function(){ };
var arr = [];

console.log(arr); // [doSomething: function]

那么为什么doSomething会出现在这里,而pop()却没有?它们是不是都加入了原型?

1 个答案:

答案 0 :(得分:4)

MDN说:

  

for ... in循环不会迭代不可枚举的属性。从内置构造函数(如Array和Object)创建的对象继承了Object.prototype和String.prototype中不可枚举的非可枚举属性,例如String的indexOf方法或Object的toString方法。循环将遍历对象本身的所有可枚举属性,以及对象从其构造函数的原型继承的属性(更靠近原型链中对象的属性覆盖原型的属性)。

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for...in

记录的内容应该来自for..in..次迭代,或类似的。

非可枚举属性的概念早于在Javascript中指定属性可枚举性的特征。

MDN说:

  

ECMAScript 3有一个名为DontEnum的内部属性。默认情况下,此属性附加到某些属性(第8.6.1节)。

     

内部DontEnum属性确定for-in枚举不会枚举的内容(第12.6.4节)。 propertyIsEnumerable测试

https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute

EcmaScript 3规范定义了许多具有DontEnum属性的属性。 http://bclary.com/2004/11/07/

这实际上并不能解决整个难题,因为例如Array.prototype.pop未明确列为具有DontEnum属性,因此只列出Array.prototype本身。可能隐含了本机函数的DontEnum属性,但我无法找到它的参考。例如,MDN的第一个引用将String.prototype.indexOf描述为不可枚举,而EcmaScript 3规范中也没有明确提及。