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)
| 归档时间: |
|
| 查看次数: |
359 次 |
| 最近记录: |