javascript - 当扩展 Obect.prototype 然后在一个 istance 上使用 for in 时,js 也会遍历原型
问题描述
我将此方法添加到对象原型中:
if( !Object.prototype.forEach ) {
Object.prototype.add({
'forEach': function(fn) {
var object = this, ret;
Object.keys(object).forEach(function(key) {
if (ret === false)
return;
ret = fn.call(null, object[key], key, object);
});
return object;
}
});
}
然后这样做:
switch( typeOf( arguments[0] ) ) {
case 'string':
// ...
case 'object':
var prop;
for(prop in arguments[0]) {
// ...
}
并且代码也在迭代forEach
。如果arguments[0]
是{a: 'a', b: 'b'}
,它会遍历a,b,forEach
。我该如何解决这个问题?
先感谢您。
解决方案
添加到Object.prototype
. 发生冲突的机会太大了。您可以使用恰好使用您添加的属性名称作为标记的库,如果它存在于给定对象上则做一件事,但如果它不存在则做其他事情。(ES2015 实际上必须添加一种全新的属性名称 [ Symbol
] 以使内置操作具有类似的逻辑 [例如,用于获取迭代器和类似的]。)
但是,如果您仍然这样做,请确保您添加的属性是不可枚举的,方法是使用Object.defineProperty
:
Object.defineProperty(Object.prototype, "forEach", {
value: function() { /*...*/ },
enumerable: false // This is actually the default, just here for emphasis
});
我建议无论您在哪里获得该Object.prototype.add
功能,都可能不是学习的地方。
推荐阅读
- ios - interactivePopGesture 的安全区域底部布局问题
- bash - While_Run_For_loop_In_bash-权限被拒绝
- c# - 数据表中显示的“重复”数据
- mysql - 带括号和不带括号的 MySQL 给出不同的结果
- web - 如何在任何嵌入式代码中禁用图像
- android - 如何在 recyclerview 中使用运动布局
- c# - ASP.NET C# 中的字计数器桌面应用程序
- c# - 如何将DevExpress gridControl中的RepositoryItemPictureEdit中的图像保存到sql数据库
- java - Java 安卓 GcmTaskService
- reactjs - React JS - 请求的资源上不存在“Access-Control-Allow-Origin”标头。跨域资源错误