"Классы друзей" в javascript
У меня есть класс Factory, который создает объект Widget. Объекту Factory необходимо позднее вызвать "закрытый метод" объекта Widget, чтобы передать ему некоторую информацию ajax. Пока что единственная реализация, которую я придумал, - это создание открытого метода в Widget, который возвращает приватный метод фабрике, а затем удаляет себя, Factory затем возвращает новый виджет, сохраняя указатель на приватный метод., Вот упрощенный пример:
function Factory()
{
var widgetCallback = null;
this.ajaxOperation = function()
{
//some ajax calls
widgetCallback('ajaxresults');
}
this.getNewWidget = function()
{
var wid = new Widget();
widgetCallback = wid.getCallback();
return wid;
}
function Widget()
{
var state = 'no state';
var self = this;
var modifyState = function(newState)
{
state = newState;
}
this.getState = function()
{
return state;
}
this.getCallback = function()
{
delete self.getCallback;
return modifyState;
}
}
}
Есть ли лучший способ добиться эффекта, которого я добиваюсь, или это достаточно разумный подход? Я знаю, что это работает, просто любопытно, если я вступлю в какие-либо ловушки, о которых я должен знать.
2 ответа
this.getNewWidget = function() {
var val = new Widget(),
wid = val[0],
widgetCallback = val[1];
return wid;
}
function Widget() {
var state = 'no state';
var self = this;
var modifyState = function(newState) {
state = newState;
}
this.getState = function() {
return state;
}
// Return tuple of Widget and callback
return [this, modifyState];
}
Просто получите ваш конструктор, чтобы вернуть Tuple<Widget, function>
Альтернатива просто использовать закрытие области для редактирования widgetCallback
прямо в вашем Widget
конструктор
function Factory() {
var widgetCallback = null;
this.ajaxOperation = function() {
//some ajax calls
widgetCallback('ajaxresults');
}
this.getNewWidget = function() {
return new Widget();;
}
function Widget() {
var state = 'no state';
var self = this;
// set it directly here!
widgetCallback = function(newState) {
state = newState;
}
this.getState = function() {
return state;
}
}
}
Я недостаточно знаком с объектно-ориентированным JavaScript (я использую в основном один или два вкладки внутри кода GWT), чтобы на самом деле дать реальный ответ (но я обнаружил, что мой ответ был немного длинным для комментария...)
Я думаю, что самоизменяющиеся классы звучат как большой потенциал для гоча.
Лично я предпочитаю такие языки, как JavaScript, Ruby и т. Д., Которые не ограничивают то, что вы можете делать (даже если я должен использовать Java+GWT на работе, хе-хе), но где вы полагаетесь на самодисциплину, чтобы не делать глупостей. Я предпочел бы префикс имени метода с "_" (и просто избегать его использования там, где я не должен), чем пытаться применять частные методы. Поскольку JavaScript по своей природе очень неограничен в том, что вы можете делать сумасшедшими, он все равно требует большой дисциплины.
Если вы удалили метод после использования; чтобы защитить его, не могли бы вы так же легко добавить новый метод, чтобы сделать то же самое? Вы все равно будете полагаться на свою (и другие) самодисциплину и здравомыслие, не так ли?