从 javascript 类中的“私有”方法访问“公共”方法

Posted

技术标签:

【中文标题】从 javascript 类中的“私有”方法访问“公共”方法【英文标题】:Accessing "Public" methods from "Private" methods in javascript class 【发布时间】: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() 工作正常,因此这两个函数之间似乎存在一些差异。 【参考方案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();

【讨论】:

以上是关于从 javascript 类中的“私有”方法访问“公共”方法的主要内容,如果未能解决你的问题,请参考以下文章

如何访问嵌套类中的私有类方法

无法访问junit测试类中的包私有方法

如何对类中的私有成员变量进行赋值和访问

如何访问其子类中的类的私有变量?

Java中私有静态嵌套类中的访问修饰符

包私有类中的`public`修饰符