Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Наследование внутри объекта (тапок)
Author Message
тапок
Guest





Карма: 388
   поощрить/наказать


PostPosted: Sun Dec 03, 2006 10:38 am (написано за 18 секунд)
   Post subject: Наследование внутри объекта
Reply with quote

Есть некий объект, создаваемый литерально. Внутри имеются объекты и массивы объектов (будущих):
Code (JavaScript): скопировать код в буфер обмена
obj = {
        arr1: [],
        arr2: [],
        obj2:
              {
                arr3: [],
                arr4: []
              }
      };
Так вот, хочется привязать ко всем имеющимся внутри obj объектам (и ко всем добавляемым позднее) свойства и методы присутствующие по умолчанию.

Делаю нечто подобное:
Code (JavaScript): скопировать код в буфер обмена
obj.constructor.prototype.method = function(c){alert(c);};
и проверяю:
Code (JavaScript): скопировать код в буфер обмена
obj.method(1);
obj.arr1.method(2);
obj.obj2.arr3.method(3);
other = {};
other.method(4);
Однако это по понятным причинам не подходит - метод появляется вообще у всех объектов.
В мануале прочитал, что свойство prototype присутствует только у объектов, которые могут быть использованы в правой части new. Тогда пробую через конструктор:
Code (JavaScript): скопировать код в буфер обмена
function Constructor(){}
Constructor.prototype = {method: function(c){alert(c);}};

obj = new Constructor();
obj.arr1 = [];
obj.arr2 = [];
obj.obj2 = {arr3:[], arr4:[]};
и проверяю:
Code (JavaScript): скопировать код в буфер обмена
obj.method(1);
obj.arr1.method(2);
obj.obj2.arr3.method(3);
other = {};
other.method(4);
Срабатывает только для obj. Для остальных не наследуется. Как же вообще добавить prototype для obj?
Back to top
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sun Dec 03, 2006 1:58 pm (спустя 3 часа 19 минут; написано за 1 минуту 22 секунды)
   Post subject:
Reply with quote

тапок
Quote:
хочется привязать ко всем имеющимся внутри obj объектам...
Code (JavaScript): скопировать код в буфер обмена
obj.arr1 = [];
obj.arr1.method(2);
Наверно необязательно массив дополнять еще чем-нибудь.
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Sun Dec 03, 2006 5:24 pm (спустя 3 часа 26 минут; написано за 1 минуту 24 секунды)
   Post subject:
Reply with quote

Каждый объект сам по себе. Чтобы у объектов был один и тот же метод, можно при их создании или использовать одну и ту же функцию-конструктор (тогда ссылка на метод прописывается внутри конструктора или снаружи через prototype), или использовать разные функции-конструкторы, но перед созданием объектов переопределять объект-прототип одной из них.

Если же объекты создаются родными средствами ({}, Object(), new Object()...), то наследовать общий метод они могут через Object.prototype, а значит, если мы повесим метод на прототип, то все объектные типы будут затронуты.

В итоге, остаётся только присваивать метод нужным объектам руками, это для удобства может делать некая функция, где вновь созданному объекту/массиву, пришедшему туда аргументом добавляется метод, или же можно разом пробежаться по всем уже существующим свойствам-объектам нужного "корневого" объекта и передать им метод...
Back to top
View user's profile Send private message
тапок
Guest





Карма: 388
   поощрить/наказать


PostPosted: Sun Dec 03, 2006 7:39 pm (спустя 2 часа 14 минут)
   Post subject:
Reply with quote

Спасибо за разъяснения. Я тут и правда не подумавши сам брякнул.
А вот есть ли какая-нибудь разница с точки зрения скорости работы программы - повешаем ли мы метод/свойство циклом на сотню другую объектов или определим этот же метод в Object.prototype? Я частенько видел, как подобное (к примеру на сотню объектов один и тот же onmouseover) делают другие, но меня что-то это смущает - по житейской логике так "хуже" :) (я не программист) Я не правильно думаю?
Back to top
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sun Dec 03, 2006 8:01 pm (спустя 21 минуту; написано за 1 минуту 47 секунд)
   Post subject:
Reply with quote

тапок
Quote:
на сотню объектов один и тот же onmouseover
А куда деваться, если нужно повесить onmouseover? Опять же, "по житейским" (я тоже не программист) меркам это займет несколько миллисекунд.
Back to top
View user's profile Send private message Send e-mail
тапок
Guest





Карма: 388
   поощрить/наказать


PostPosted: Sun Dec 03, 2006 9:03 pm (спустя 1 час 2 минуты; написано за 10 минут 25 секунд)
   Post subject:
Reply with quote

не не - я не про то. Я спрашивал не про "время пробега" цикла по объектам, а про то, что, по сути, придется хранить для каждого объекта дублирующее свойство, а то и не одно. А ведь как просто было бы с прототипами - нет свойства у объекта - пробежался по цепочке прототипов - где-то да и найдется нужное. Тут же получается ммм... "избыточность" что ли. Ну в общем я сам не знаю - почему и спросил; мало ли какие есть нюансы, особенно когда объектов очень много.

А куда деваться, если нужно повесить onmouseover?
Ну например не создавать такой метод для этих объектов вовсе, зато прикрепить событие к документу, и во время елозенья проверять - отвечает ли объект под курсором некому условию.
Back to top
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sun Dec 03, 2006 9:34 pm (спустя 31 минуту; написано за 45 секунд)
   Post subject:
Reply with quote

Quote:
прикрепить событие к документу
Вот и вариант - никакие прототипы с циклами не нужны.
Back to top
View user's profile Send private message Send e-mail
K.Wiolowan
Участник форума



Joined: 22 Feb 2006
Posts: 53
Карма: 11
   поощрить/наказать


PostPosted: Mon Dec 04, 2006 9:45 am (спустя 12 часов 11 минут; написано за 4 минуты 4 секунды)
   Post subject:
Reply with quote

Вместо того, чтобы вешать на сотню объектов один onmouseover, можно помечать их как-то, например, атрибутом:
<div class="style1 object1">

-и добавить в глобальный document.body.onmouseover=... / document.body.addEventListener('mouseover',...)
проверку:
Code (JavaScript): скопировать код в буфер обмена
...
if (firer.className && firer.className.indexOf('object1')!= -1){
        alert('object1 onmouseover!')
}
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML