Данная тема создана с целью разделить два вопроса смешанных в одной теме здесь:
Overloading в JavaScript
Вкратце повторю суть задачи.
Есть некий объект (
A) у которого будут вызываться различные методы. И есть серия объектов (
B1,
B2,
B3,...) которые будут обращаться к методам
A.
У
B1,
B2,
B3,... общий прототип (
P). В прототипе
P или в конструкторе, при создании объекта, я могу создать что-либо, что позволит потом получить ссылку на этот объект.
Теперь сама задача: когда
B1,
B2,
B3,... обращается к методам
A в этих методах я могу обратиться к "caller", но при этом я получаю ссылку на саму функцию прототипа
P. А мне еще надо получить ссылку на объект у которого она была вызвана.
Пока объект
B1 существует в единственном экземпляре проблем нет - я его цепляю к прототипу и потом легко получаю, но как только появляется
B2,
B3,... уже достучаться до текущего объекта не получается.
Объект
A сейчас создается один раз и затраты на его создание сейчас большого значения не имеют. А вот объекты типа
B будут создаваться регулярно и затраты на их создание мне надо максимально уменьшить. Т.е. минимализировать количество процедур в объекте
B и аргументов передаваемых в объект
A.
Т.е. надо усложнять объект
A, для того чтобы максимально упростить вызов его методов из объектов
B. Так-же не будет проблемой если мы усложним конструктор объекта
B.
Теперь пример "
не рабочего" кода, который я обещал привести:
var A = {
t : function()
{
var this_func = arguments.callee; // Ссылка на текущую функцию
var caller = this_func.caller; // Ссылка на вызывающую функцию (в данном случае я получаю ссылку на свойство из прототипа)
var that = caller.ref // Попытка получить ссылку на объект из которого произошел вызов
alert(that.x);
}
}
var B = function(x)
{
this.x = x; // Сохраняю свойство, для тестирования
this.z.ref = this; // Пытаюсь сохранить ссылку на текущий объект, чтобы потом его получить. Но поскольку this.z фактически является свойством прототипа, это свойство потом презапишется
}
B.prototype = {
x : "",
z : function()
{
A.t();
}
}
var B1 = new B("LALA1");
B1.z();
var B2 = new B("LALA2");
B2.z();
Ключевые моменты в коде я прокомментировал.
Если запустить код, том виде как я привел - вроде-бы все работает как надо. Мы получим, как и ожидаем два алерта: "
LALA1" и "
LALA2".
Но если изменить финальную часть этого кода, например так:
var B1 = new B("LALA1");
var B2 = new B("LALA2");
B1.z();
B2.z();
то все работает не правильно. Оба алерта будут "
LALA2".
Хотелось бы получить что-либо подобное, но правильно работающее.