Javascript Private Methods - PullRequest
       24

Javascript Private Methods

1 голос
/ 15 августа 2011

Я читал главу 2 о методах Apres Javascript Pro и, в частности, раздел о Методы Provate .

В качестве примера показан следующий фрагмент кода:

// Listing 2-23. Example of a Private Method Only Usable by the Constructor Function
function Classroom(students, teacher) {
    // A private method for displaying all the students in the class
    function disp() {
       alert(this.names.join(", "));  // i think here there is an error. Should be alert(this.students.join(", "));
    }

    // Store the class data as public object properties
    this.students = students;
    this.teacher  = teacher;

    disp();
}

Помимо ошибки в строке 4, когда я создаю новый объект Classroom,

var class = new Classroom(["Jhon", "Bob"], "Mr. Smith");

выдается следующая ошибка:

Uncaught TypeError: Cannot call method 'join' of undefined.

Читая по адресу douglas.crockford.com/private.html, я нашел это:

По договоренности, мы делаем эту переменную приватной. Это используется, чтобы сделать объект доступным для приватных методов. Это обходной путь для ошибки в спецификации языка ECMAScript, которая приводит к неправильной настройке внутренних функций.

Действительно, создавая переменную , , указывающую на , , предыдущий код работает, как и ожидалось.

function Classroom(students, teacher) {
    var that;
    // A private method used for displaying al the students in the class
    function disp() {
        alert(that.students.join(", "));
    }

    // Store the class data as public object properties
    [...]   
    that = this;

    disp();             
}

Итак, мой вопрос:

  • Всегда нужно создавать эту переменную?

Если да, это означает, что пример был совершенно неверным.

Ответы [ 3 ]

3 голосов
/ 15 августа 2011

Необходимо сохранить значение this только в другой переменной that, если вы по какой-то причине хотите сохранить значение, которое this имело при вызове внешнего метода.

Получаемая ошибка (Uncaught TypeError: Невозможно вызвать метод 'join' из undefined.) Означает, что свойство names не найдено в объекте this и что поэтому значение равно undefined и поэтому не может names свойство.

Значение this в JavaScript немного сложно узнать. Если вы вызываете функцию f как метод , то есть если вы пишете o.f(), то this привязывается к o внутри функции f. Если вы вызываете f как функцию , то есть f(), тогда this привязывается к глобальному (оконному) объекту (!).

Поэтому, если вы измените последнюю строку disp(); на this.disp();, то this будет тем, что вы ожидаете внутри disp.

Код действительно неверный ...

2 голосов
/ 15 августа 2011

это относится к владельцу функции (объект окна, элемент HTML ...), поэтому в закрытой функции вы не сможете получить доступ к объекту, над которым работаете.таким образом, вы сохраняете объект в переменной that, поэтому вы можете получить к нему доступ из любого частного метода в классе.

1 голос
/ 15 августа 2011

В вашем первом примере есть еще одна ошибка: вы не определяете this.names, но ответ на ваш вопрос в основном «да» - внутри тела функции disp переменная «this» назначается глобальной области видимости, поэтомувам нужно создать переменную 'that'.

...