例如,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()
却没有?它们是不是都加入了原型?
答案 0 :(得分:4)
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规范中也没有明确提及。