【问题标题】:Accessing "Public" methods from "Private" methods in javascript class从 javascript 类中的“私有”方法访问“公共”方法
【发布时间】:2011-02-11 19:31:16
【问题描述】:

有没有办法从类中的“私有”函数调用“公共”javascript 函数?

查看以下课程:

function Class()
{
    this.publicMethod = function()
    {
        alert("hello");
    }

    privateMethod = function()
    {
        publicMethod();
    }

    this.test = function()
    {
        privateMethod();
    }
}

这是我运行的代码:

var class = new Class();
class.test();

Firebug 给出这个错误:

publicMethod 未定义:[Break on this error] publicMethod();

是否有其他方法可以在 privateMethod() 中调用 publicMethod() 而无需访问全局类变量 [即class.publicMethod()]?

【问题讨论】:

  • 我希望这只是您的示例中的一个错字,但您的 privateMethod 是一个全局变量。
  • 在 Firefox 中,如果我调用 class.privateMethod() 会出现错误,而 class.publicMethod() 工作正常,因此这两个函数之间似乎存在一些差异。

标签: javascript oop private public


【解决方案1】:

您可以在构造函数的范围内保存一个变量来保存对this 的引用。

请注意:在您的示例中,您在 privateMethod = function() 之前省略了 var,使 privateMethod 成为全局。我在这里更新了解决方案:

function Class()
{
  // store this for later.
  var self = this;
  this.publicMethod = function()
  {
    alert("hello");
  }

  var privateMethod = function()
  {
    // call the method on the version we saved in the constructor
    self.publicMethod();
  }

  this.test = function()
  {
    privateMethod();
  }
}

【讨论】:

    【解决方案2】:

    接受的答案可能具有不良副作用,即在每个实例中将创建 publicMethodtestprivateMethod 的单独副本。避免这种情况的习惯用法是:

    function Class()
    {}
    
    Class.prototype=(function()
    {
        var privateMethod = function(self)
        {
            self.publicMethod();
        }
    
    
        return 
        {
            publicMethod: function()
            {
                alert("hello");
            },
            test: function()
            {
                privateMethod(this);
            }
        };
    }());
    

    换句话说,您需要将this 作为参数传递给私有函数。作为回报,您可以得到一个 true 原型,而不必用自己的私有和公共函数版本污染每个实例。

    【讨论】:

    • 不错!你也可以privateMethod.call(this)而不是传入
    【解决方案3】:

    torazaburo 的答案是最好的答案,因为它避免了创建私人成员的多个副本。我很惊讶克罗克福德根本没有提到它。或者,根据您喜欢声明公共成员函数的语法,您可以这样做:

    function Class()
    {}
    
    (function() {
        var privateMethod = function(self) {
            self.publicMethod();
        };
    
        Class.prototype.publicMethod = function() {
            alert('hello');
        };
    
        Class.prototype.test = function() {
            privateMethod(this);
        };
    }());
    

    【讨论】:

      【解决方案4】:

      这种方法不是可取的吗?不过我不确定

      var klass = function(){
        var privateMethod = function(){
          this.publicMethod1();
        }.bind(this);
      
        this.publicMethod1 = function(){
          console.log("public method called through private method");
        }
      
        this.publicMethod2 = function(){
          privateMethod();
        }
      }
      
      var klassObj = new klass();
      klassObj.publicMethod2();
      

      【讨论】:

        猜你喜欢
        • 2013-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-13
        • 1970-01-01
        • 2013-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多