使用私有成员创建对象的技术差异

时间:2013-05-14 21:14:51

标签: javascript

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调试器的结果:

enter image description here

1 个答案:

答案 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__属性。我最初没有指出这是不好的。