Закрытые переменные и доступ к родительскому объекту - PullRequest
1 голос
/ 10 февраля 2012

Я хочу, чтобы основной объект M содержал подобъект S, у которого есть некоторый метод E, который имеет закрытую переменную P. Я также хочу, чтобы метод E имел доступ к M через другую переменную V. Для частных переменных я делаем это:

M.S = function () {
    var P,
        V; // how to set V to M?

    return {
        E: function () {
            // stuff goes here
        }
    }
}();

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

M.S = function () {
    var P,
        V = this;

    return {
        E: function () {
            // stuff goes here
        }
    }
};
M.S = M.S()

В основном мне нужно знать, что является хорошей практикой для этого, так как я новичок в закрытых переменных в Javascript.

Ответы [ 2 ]

3 голосов
/ 10 февраля 2012

Довольно простой способ сделать это:

M.S = function (V) { // <-- V is declared locally
    var P;

    return {
        E: function () {
            // stuff goes here
        }
    };
}(M);

V локально объявлен через формальный параметр.Ссылка M присваивается V, через function(V){...}(M);.

Даже если M переопределен в более поздней точке, V все равно будет указывать на нужный объект.

1 голос
/ 10 февраля 2012

А как насчет этого? Вы вызываете S в контексте M:

M.S = function () {
    var P,
        V = this; // how to set V to M?

    return {
        E: function () {
            // stuff goes here
            // you can refer M via V reference
        }
    }
}.call(M);
...