Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问;“公众”;方法来自;“私人”;javascript类中的方法_Javascript_Oop_Private_Public - Fatal编程技术网

访问;“公众”;方法来自;“私人”;javascript类中的方法

访问;“公众”;方法来自;“私人”;javascript类中的方法,javascript,oop,private,public,Javascript,Oop,Private,Public,有没有办法从类中的“私有”函数调用“公共”javascript函数 查看下面的课程: function Class() { this.publicMethod = function() { alert("hello"); } privateMethod = function() { publicMethod(); } this.test = function() { private

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

查看下面的课程:

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

    privateMethod = function()
    {
        publicMethod();
    }

    this.test = function()
    {
        privateMethod();
    }
}
以下是我运行的代码:

var class = new Class();
class.test();
Firebug出现以下错误:

未定义publicMethod:[在此错误上中断]publicMethod()


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

您可以在构造函数的作用域中保存一个变量,以保存对该
的引用

请注意:在您的示例中,您在
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();
  }
}

接受的答案可能会产生不良的副作用,即在每个实例中分别创建
publicMethod
test
privateMethod
的副本。避免这种情况的习惯用法是:

function Class()
{}

Class.prototype=(function()
{
    var privateMethod = function(self)
    {
        self.publicMethod();
    }


    return 
    {
        publicMethod: function()
        {
            alert("hello");
        },
        test: function()
        {
            privateMethod(this);
        }
    };
}());

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

torazaburo的答案是最好的,因为它避免了创建私有成员的多个副本。我很惊讶Crockford一点也没提到。或者,根据声明公共成员函数的语法,可以执行以下操作:

function Class()
{}

(function() {
    var privateMethod = function(self) {
        self.publicMethod();
    };

    Class.prototype.publicMethod = function() {
        alert('hello');
    };

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

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

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

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