【问题标题】:How do I access private properties from within public methods in JavaScript? [duplicate]如何从 JavaScript 的公共方法中访问私有属性? [复制]
【发布时间】:2012-11-22 14:31:34
【问题描述】:

可能重复:
Javascript: Do I need to put this.var for every variable in an object?

我想在 JavaScript 中创建一个“类”,其他“类”应该从该类继承。

因此,我使用原型对象添加了“公共方法”。

在这些方法中,我想访问我的类的私有属性。

似乎我无法访问它们。我该怎么做呢?这是我的代码:

<!doctype html>

<html>

    <head>
        <title>OOP test</title>

        <script>

            var ParentClass = function(){
                var data = [];
            }

            ParentClass.prototype.addData = function(somedata){
                data.push(somedata); // ReferenceError: Can't find variable: data
            }

            var p = new ParentClass();
            p.addData("foo");

        </script>
    </head>

    <body>
    </body>

</html>

【问题讨论】:

    标签: javascript oop inheritance prototype


    【解决方案1】:

    <head>
        <title>OOP test</title>
    
        <script>
    
            var ParentClass = function(){
                this.data = [];
            }
    
            ParentClass.prototype.addData = function(somedata){
                this.data.push(somedata); // ReferenceError: Can't find variable: data
            }
    
            var p = new ParentClass();
            p.addData("foo");
    
        </script>
    </head>
    
    <body>
    </body>
    

    【讨论】:

      【解决方案2】:

      没有公共或私有(即使你引用它们),只有对象属性和变量。您不能访问不在范围内的变量。 .addData 方法的定义超出了data 变量的范围。

      只要你有对象的引用就可以访问对象的属性,所以让它成为一个对象的属性:

      var ParentClass = function(){
          this.data = [];
      }
      
      ParentClass.prototype.addData = function(somedata){
          this.data.push(somedata);
      }
      

      【讨论】:

      • data.push(somedata);的调用也需要改成this.data.push(somedata);
      • @valmar 是的,谢谢,我忘了在其他语言中(C#、java,OP 最有可能来自)this 是可选的,所以它不会很明显
      【解决方案3】:

      它会引发引用错误,因为变量“数据”是函数“父类”的“私有”。为了模拟可以使用闭包类型方法的功能。

      var ParentClass = function(){
          var data = [];
          this.addData = function(somedata){
              data.push(somedata); // Closure will have access to all variables in 'ParentClass'
          }
      }
      

      但是,这会干扰您似乎希望实现的原型继承。

      【讨论】:

        猜你喜欢
        • 2011-02-11
        • 1970-01-01
        • 2013-10-08
        • 2013-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多