【问题标题】:Public / private members in JavaScriptJavaScript 中的公共/私有成员
【发布时间】:2015-09-27 15:04:26
【问题描述】:

考虑一下:

  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();

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

【问题讨论】:

    标签: javascript


    【解决方案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?

    【讨论】:

    • 说的很好!那篇文章正是我想要的。此外,您的第二段确实帮助我理解了问题所在。谢谢。
    • 还找到了一个很好的答案,关于如何在仍然使用 Prototype 的同时创建公共/私有方法:stackoverflow.com/questions/1441212/…
    猜你喜欢
    • 2012-10-25
    • 2013-10-10
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2015-05-04
    • 2013-06-08
    • 2014-09-22
    相关资源
    最近更新 更多