закрытый член javascript недоступен публичным методом - PullRequest
2 голосов
/ 01 марта 2012

У меня есть следующие настройки.method и method1 оба являются открытыми методами класса Student.Но почему «только» метод доступа к закрытой переменной p

​function Student() {
    var p = 10;
    this.method = function() {
        document.write(p);
    }; 
};

Student.prototype.method1 = function() {
    document.write('here');
    document.write(p);
};

var s = new Student();
s.method();
s.method1();
​

Как это имеет смысл, я имею в виду, что это «открытый метод, который не имеет доступа к закрытым членам!»

Ответы [ 3 ]

4 голосов
/ 01 марта 2012

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

Student по-прежнему является функцией, а p является локальной для этой функции. К нему никак нельзя получить доступ из внешнего кода. method может получить доступ к p, поскольку он определен внутри Student и, следовательно, образует замыкание, но method1 объявлен вне области действия Student.

Присвоение функции прототипу другой функции не может предоставить ей доступ к ее локальным переменным.

Рассмотрим этот пример:

var p = 41;

function foo() {
    console.log(p);
}

​function Student(){
    var p = 10;
};

Student.prototype.bar = foo;

var s = new Student();
s.bar();
foo();

Вы можете подумать, что, поскольку foo вызывается как метод объекта, он может иметь доступ к локальным переменным, но это не так. Единственное значение, которое определяется динамически, это this, это специальное ключевое слово. Все остальные переменные строго определены в цепочке областей действия.

0 голосов
/ 01 марта 2012

В JavaScript открытые методы, такие как method1 (то есть методы, добавленные в прототип), не имеют доступа к закрытым переменным, но имеют "привилегированные" методы, такие как ваш method do.

Помните, что JavaScript не имеет тех же правил видимости, что и другие объектно-ориентированные языки. Метод method формирует замыкание вокруг приватных переменных в функции конструктора Student, а method1 - нет.

0 голосов
/ 01 марта 2012

method1 определен вне определения базового класса для Student.Как таковой, он не может получить доступ к переменным, объявленным как private внутри определения базового класса.Если бы это было возможно, вы могли бы обойти ограничения частных переменных в существующих классах, просто определив открытый метод для этого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...