2013-08-01 4 views
0

Я использую функцию прототипа, потому что они должны иметь лучшую производительность, когда «класс» создается несколько раз. Кроме того, не все переменные должны быть доступны снаружи, поэтому они определяются внутри «класса» через var, поэтому они не доступны нигде вне закрытого пространства.JavaScript: частные переменные в функции прототипа

Теперь у меня есть этот простой пример, где я определяю «частную» переменную и определяю множество и получаю для нее функции.

Пример:

function Test() { 
    var hello = "org"; 

    this._get = function (value) { 
      hello = value; 
    } 
    this._set = function (value) {    
     return hello;    
    } 
} 


var test = new Test(); 
console.log(test._get()); 
test._set("new"); 
console.log(test._get()); 

Скрипач: http://jsfiddle.net/LdwuS/

Теперь я хочу сделать то же самое с прототипом, но функция ПОЛУЧИТЬ всегда возвращает неопределенное значение!

Пример:

function Test() { 
    var hello = "org"; 
} 

Test.prototype.set = function (value) { 
    return hello; 
} 
Test.prototype.get = function (value) { 
    hello = value; 
} 

var test = new Test(); 
console.log(test.get()); 
test.set("new"); 

Скрипач: http://jsfiddle.net/rK22m/

я делаю что-то неправильно, или это не возможно? console.log (test.get());

+1

Невозможно получить доступ к переменным, определенным внутри функции, из функций, определенных вне этой функции. Это включает функции в '.prototype'. –

+2

... и во втором примере вы изменили поведение 'set' и' get'. –

+0

ECMAScript 6, скорее всего, определит «ключ» доступа к свойствам, где вам может потребоваться ключ для доступа к определенным свойствам, предоставляя что-то вроде частных членов на объектах. –

ответ

4

Функции, связанные с прототипом, имеют точно такой же доступ к объекту, что и любая другая функция. Кроме того, как и другие функции, у них есть no доступ к локальным переменным, которые существовали в функции конструктора при его вызове.

-2

http://jsfiddle.net/uy38G/

делать это таким образом работает

function Test(){ 
    var hello = "org"; 

    this.getHello = function(){ 
     return hello; 
    } 

    this.setHello = function(value){ 
     return hello = value; 
    } 
} 

var test = new Test(); 

console.log(test.getHello()); 
test.setHello('new org'); 
console.log(test.getHello()); 
+2

Вы имеете в виду делать это точно так же, как OP уже делал это в первом примере кода вопроса? –

+0

С тех пор он отредактировал свой первый пример. – zcreative

+0

Первый пример не изменился. –

1

К сожалению, вы просто не можете делать то, что вы пытаетесь достичь, потому что единственный способ создания общественных функций, которые имеют доступ к закрытым переменным в JavaScript является объявлять функции в той же области, что и частные переменные, так что функции создают закрытие по ним, а затем публично раскрывают функции.

Вы должны сделать выбор, жертвуя преимуществами использования прототипов или жертвами принудительной конфиденциальности. Широко распространенное решение состоит в том, чтобы полагаться на документацию на личные свойства личности или на префикс их с символом, как _. Тем не менее, вы всегда можете сделать некоторые функции полностью частными.

var MyClass = (function() { 
    function MyClass() { 
     //private 
     this._private = 'private'; 
     this.public = 'public'; 

     //call privateFunction in the context of the current instance 
     privateFunction.call(this); 
    } 

    //public functions 
    MyClass.prototype.publicFunction = function() { 
    }; 

    //private function 
    function privateFunction() { 
    } 

    return MyClass; 

})(); 
Смежные вопросы