JavaScript中的公共/私人成员

时间:2015-09-27 15:04:26

标签: javascript

考虑一下:

  var Foo = function Foo () {
      var numberVar = 0;

      fooPrototype = {
          getNumberVar: function () {
                return numberVar;
          },
          setNumberVar: function (val) {
                this.numberVar = val;
          }
      }
      return fooPrototype;
  };

  var foo = new Foo();

或者,看看这个:

  var Bar = function Bar() {
        var numberVar = 0;
  };

  Bar.prototype = {
      getNumber: function () {
          return this.numberVar;
      },
      setNumber: function (val) {
          this.numberVar = val;
      }
  };

  var bar = new Bar();

他们都做同样的事情,因为他们允许公共/私人成员。 这样或那样做有什么好处吗?

1 个答案:

答案 0 :(得分:1)

这里的逻辑基于错误的假设。在第二个实现中,从不使用构造函数变量numberVar。您没有可以访问它的代码,因此您没有在第二个代码块中使用私有变量。

第二个实现中的方法是访问名为numberVar的对象属性,该属性可作为对象上的属性公开访问,该属性与构造函数中同名的局部变量不同。您不能在第二个实现中拥有私有变量,因为原型声明的方法未在私有范围中声明。

这是你的第二个代码块中发生的事情:

  var Bar = function Bar() {
        // this variable is never used as there is no code in this scope
        // that can reach this variable.  In fact, it is garbage collected
        // immediately
        var numberVar = 0;
  };

  Bar.prototype = {
      getNumber: function () {
          return this.numberVar;
      },
      setNumber: function (val) {
          // sets a public property on the object
          this.numberVar = val;
      }
  };

  var bar = new Bar();
  bar.setNumber(10);
  console.log(bar.numberVar);    // 10, this property is public

有关构造函数与原型定义方法中声明的方法的一般讨论,请参阅此讨论:

Advantages of using prototype, vs defining methods straight in the constructor?