我今天遇到这个问题:
我想用一些有用的函数扩展JavaScript Object类,所以我写了这样的东西:
Object.prototype.fn = function() {
// Do some cool stuff...
};
然后我使用另一个函数来执行这样的循环:
for( var i in obj ) {
this[i] = obj[i]; // 'this' --> is another Object
console.log( i, obj[i] );
}
所以我把东西搬到了'obj'的另一个对象。但是,正如您在日志中看到的那样,'fn'函数现在位于我的扩展对象中,并且位于__proto__
中。我想要的是在我的'for'循环中不使用它来避免这种情况:
if( typeof obj[i] !== 'function' ) // Then do it
所以我想知道如何实现本机函数(例如toString())以在原型之外保持不可见。有什么建议吗?
答案 0 :(得分:2)
您可以使用名为defineProperty
的方法来设置您的属性并使其不可枚举(或者如您所说,保持隐身):
var obj = {};
Object.defineProperty(obj, 'test', {
enumerable: false,
configurable: false,
writable: true,
value: 'hello'
});
你的属性obj.test
存在(值为hello
)但现在不可枚举,所以做了类似的事情:
for(var i in obj) console.log(i);
// OR
Object.keys(obj);
不会打印'test',但您仍然可以将其作为属性访问(obj.test
)