带有隐藏函数的JavaScript扩展类

JavaScript Extend Class with hidden functions

本文关键字:JavaScript 扩展 函数 隐藏      更新时间:2023-09-26

我今天遇到这个问题:

我想用一些有用的函数来扩展JavaScriptObject类,所以我写了这样的东西:

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())是如何实现的,以便在原型之外保持不可见。有什么建议吗?

您可以使用一个名为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)访问