JavaScript传统上没有提供属性隐藏机制('私有成员').
由于JavaScript是词法范围的,你可以使用构造函数作为对"私有成员"的闭包并在构造函数中定义方法,从而在每个对象级别上模拟这个,但这不适用于在构造函数的原型属性.
当然,有办法解决这个问题,但我不推荐它:
Foo = (function() { var store = {}, guid = 0; function Foo() { this.__guid = ++guid; store[guid] = { bar : 'baz' }; } Foo.prototype.getBar = function() { var privates = store[this.__guid]; return privates.bar; }; Foo.prototype.destroy = function() { delete store[this.__guid]; }; return Foo; })();
这会将"私有"属性存储在与您的Foo
实例分开的另一个对象中.确保destroy()
在完成对象后调用:否则,您刚刚创建了内存泄漏.
编辑2015年12月1日: ECMAScript6使得不需要手动物件破坏可能的,例如通过使用改进的变体WeakMap或优选符号,避免了对外部存储完全的需要:
var Foo = (function() { var bar = Symbol('bar'); function Foo() { this[bar] = 'baz'; } Foo.prototype.getBar = function() { return this[bar]; }; return Foo; })();