6

例如,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()没有呢?他们不是都添加到原型中了吗?

4

1 回答 1

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/

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

于 2013-05-20T09:34:28.430 回答