JavaScript使用隐藏函数扩展类

时间:2015-11-22 13:03:46

标签: javascript object prototype

我今天遇到这个问题:

我想用一些有用的函数扩展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())以在原型之外保持不可见。有什么建议吗?

1 个答案:

答案 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