Here我找到了一个启用对象私有成员的javascript模块模式。如果我做对了,可以这样写:
var myObject1 = (function(){
var privateMember = 42;
return {
publicMember: function() {
return privateMember;
}
}
})();
但是有更有效的方法:
var myObject2 = new function() {
var privateMember = 42;
this.publicMember = function() {
return privateMember;
}
}
这两者有什么区别吗?是否还有其他可能来实施私人会员?
这是Chrome调试器的结果:
答案 0 :(得分:2)
这两者之间有什么区别吗?
一个主要区别是,在使用 new 的第二种情况下,返回的对象在其[[Prototype]]
链上有一个额外的对象,它是构造函数表达式的公共原型。可以使用__proto__
在某些浏览器中访问该对象。
此外,myObject1.constructor
是内置的Object函数,而myObject2.constructor
是函数表达式创建的函数。
是否还有其他可能来实施私人会员?
我想你可以使用对象(无用的)__proto__
对象,但这比隐私更加混淆(在某些浏览器中不可用):
var foo = new function() {
this.__proto__.privateMember = 42;
this.publicMember = function() {
return this.__proto__.privateMember;
}
};
alert(foo.publicMember());
非常难看。
闭包已经被用来模拟javascript中的私人成员很长一段时间(至少超过10年)但是没有任何真正的压力要将它们包含在ECMA-262中(据我所知) 。我想这表明私有成员很方便,但对于实现javascript通常用于的主机环境脚本类型所需的功能并不重要。
正如Bergi所说,应该使用ES5 Object.getPrototypeOf方法代替(非标准)__proto__
属性。我最初没有指出这是不好的。