Доступ к "публичным" методам из "приватных" методов в классе javascript - PullRequest
12 голосов
/ 24 апреля 2010

Есть ли способ вызывать "публичные" функции 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 ();

Есть ли другой способ вызова publicMethod () внутри privateMethod () без доступа к глобальной переменной класса [т.е. class.publicMethod ()]

Ответы [ 4 ]

8 голосов
/ 24 апреля 2010

Вы можете сохранить переменную в области видимости конструктора, чтобы сохранить ссылку на this.

Обратите внимание: В вашем примере вы пропустили var до privateMethod = function(), сделав этот 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();
  }
}
5 голосов
/ 17 июня 2013

Принятый ответ может иметь нежелательный побочный эффект, так как в каждом случае будут создаваться отдельные копии publicMethod, test и privateMethod. Идиома для избежания этого:

function Class()
{}

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


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

Другими словами, вам нужно передать this в функцию private в качестве аргумента. Взамен вы получаете прототип true без необходимости загрязнения каждого экземпляра своими версиями приватных и публичных функций.

2 голосов
/ 31 июля 2013

ответ torazaburo является лучшим, так как он позволяет избежать создания нескольких копий частных пользователей. Я удивлен, что Крокфорд вообще не упоминает об этом. Кроме того, в зависимости от синтаксиса, который вы предпочитаете для объявления открытых функций-членов, вы можете сделать это:

function Class()
{}

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

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

    Class.prototype.test = function() {
        privateMethod(this);
    };
}());
0 голосов
/ 02 апреля 2014

Разве этот подход не рекомендуется? Я не уверен, хотя

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