2010-04-24 3 views
12

Есть ли способ вызвать «общедоступные» функции javascript из «частных» в классе?Доступ к «общедоступным» методам из «частных» методов в классе javascript

Заканчивать класс ниже:

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

    privateMethod = function() 
    { 
     publicMethod(); 
    } 

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

Вот код, я бегу:

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

Firebug дает эту ошибку:

publicMethod не определен: [BREAK на этом error] publicMethod();

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

+4

Надеюсь, это просто опечатка в вашем примере здесь, но ваш 'privateMethod' является глобальной переменной. –

+0

В Firefox, если я вызываю 'class.privateMethod()', есть ошибка, тогда как 'class.publicMethod()' отлично работает, поэтому кажется, что существует некоторая разница между двумя функциями. – mon4goos

ответ

5

Принятая ответ имеет, возможно, нежелательный побочный эффект, что отдельные копии 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, не загрязняя каждый экземпляр своими собственными версиями частных и общедоступных функций.

+2

Ницца! Вместо того чтобы проходить, вы всегда можете 'privateMethod.call (это)' слишком – gnarf

8

Вы можете сохранить переменную в объеме конструктора, чтобы сохранить ссылку на 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(); 
    } 
} 
2

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

function Class() 
{} 

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

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

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

Является ли этот подход не рекомендуется один? Я не уверен, хотя

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(); 
Смежные вопросы