Статический публичный метод доступа к закрытым переменным экземпляра в Javascript - PullRequest
1 голос
/ 16 марта 2009

Я читал книгу Диаса «Про шаблоны проектирования JavaScript». Отличная книга. Я сам не профессионал в любом случае. Мой вопрос: могу ли я иметь статическую функцию, которая имеет доступ к частным переменным экземпляра? В моей программе есть несколько устройств, и выход одного из них можно подключить к входу другого. Эта информация хранится во входных и выходных массивах. Вот мой код:

var Device = function(newName) {
    var name = newName;
    var inputs  = new Array();
    var outputs = new Array();
    this.getName() {
        return name;
    }
};
Device.connect = function(outputDevice, inputDevice) {
    outputDevice.outputs.push(inputDevice);
    inputDevice.inputs.push(outputDevice);
};

//implementation
var a = new Device('a');
var b = new Device('b');
Device.connect(a, b);  

Похоже, это не работает, потому что Device.connect не имеет доступа к массивам входов и выходов устройства. Есть ли способ получить к ним доступ, не добавляя привилегированные методы (например, pushToOutputs) на устройство, которое могло бы его выставить?

Спасибо! Стив.

Ответы [ 2 ]

2 голосов
/ 16 марта 2009

Евгений Морозов прав - вы не можете получить доступ к этим переменным, если создадите их в функции такими, какие вы есть. Мой обычный подход заключается в том, чтобы сделать их переменными this, но назвать их так, чтобы было ясно, что они должны быть приватными:

var Device = function(newName) {
    this._name = newName;
    this._inputs  = new Array();
    this._outputs = new Array();
    this.getName() {
        return this._name;
    }
};
Device.connect = function(outputDevice, inputDevice) {
    outputDevice._outputs.push(inputDevice);
    inputDevice._inputs.push(outputDevice);
};

//implementation
var a = new Device('a');
var b = new Device('b');
Device.connect(a, b);
1 голос
/ 16 марта 2009

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

Честно говоря, я никогда не чувствовал необходимости в частных переменных, особенно в коде Javascript. Так что я бы не стал их публиковать, но это мое мнение.

...