在for-in循环期间仅显示自定义对象属性

Src*_*Src 10 javascript

Array.prototype.myFeature = function() {};

var arr = ['some', 'items'];

for (var prop in arr) {
  console.log(prop);
}
Run Code Online (Sandbox Code Playgroud)

该代码的输出将是:0,1,myFeature.

问题是:为什么只有Array原型的自定义添加功能被输出,而不是原型中存在的所有功能?

aps*_*ers 18

这是因为内置数组方法被定义为不可枚举,而普通赋值创建的属性是可枚举的.在内部,属性具有由其关联属性描述符指定的行为特征,该属性描述符在属性创建时定义.以这种方式提供的一个功能是属性的可枚举性.

相比

> Object.getOwnPropertyDescriptor(Array.prototype, "join")
{value: ƒ, writable: true, enumerable: false, configurable: true}
Run Code Online (Sandbox Code Playgroud)

> Object.getOwnPropertyDescriptor(Array.prototype, "myFeature")
{value: ƒ, writable: true, enumerable: true, configurable: true}
Run Code Online (Sandbox Code Playgroud)

第一个属性描述符对象有enumerable: false第二个属性描述符对象enumerable: true.for-in循环中不枚举不可枚举的属性.

您可以使用以下命令定义自己的非可枚举属性Object.defineProperty:

Object.defineProperty(Array.prototype, "myFeature", { value: function() {}, enumerable: false });
Run Code Online (Sandbox Code Playgroud)