Я новичок в наследовании (прототипа) JavaScript и пытаюсь узнать об этом больше. В качестве примера я использую простой шаблон наблюдателя, в котором я хочу, чтобы наблюдаемые объекты были получены из объекта «субъект». Вот что я ХОЧУ сделать:
function subject()
{
var callbacks = {}
this.register = function(name, callback)
{
callbacks[name] = callback;
}
this.unregister = function(name)
{
delete callbacks[name];
}
var trigger = function()
{
var a = arguments;
var t = this;
$.each(callbacks, function(name, callback)
{
callback.apply(t, a);
});
}
}
list.prototype = new subject()
function list()
{
var items = {}
this.add = function(name, item)
{
items[name] = item;
trigger('add', name);
}
this.remove = function(name)
{
delete items[name];
trigger('remove', name);
}
}
Теперь, используя приведенный выше код, как показано ниже, я сталкиваюсь со своей первой проблемой:
var l = new list()
l.register('observer1', function() { console.log(this, arguments) });
l.add('item1', 'value1'); // <-- ReferenceError: trigger is not defined, trigger('add', name);
Чтобы продолжить тестирование, я сделал функцию триггера общедоступной, используя вместо этого this.trigger. Запустив мой пример снова, я столкнулся со следующей проблемой:
var l = new list()
l.register('observer1', function() { console.log(this, arguments) });
l.add('item1', 'value1'); // <-- output: subject, ["add", "item1"]
Объект this
— это subject
, я хочу, чтобы он был list
. Моя третья проблема возникает при создании другого списка:
var l2 = new list();
//Don;t register any observers
l2.add('item1', 'value1'); // <-- output: subject, ["add", "item1"]
Список callbacks
является общим для двух списков.
Я пробовал подобные вещи с Object.create(new subject()) и сталкивался с похожими проблемами.
Мои 3 вопроса в этом:
- Могу ли я иметь частные методы, которые можно использовать в производных объектах (и должен ли я вообще заботиться о том, чтобы они были частными или общедоступными)?
- Как мне получить объект
this
, который я хочу (без использования function.call в производном объекте, если это возможно)? - Как я могу сохранить список
callbacks
в базовом объекте без совместного использования?