Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вызов конструктора прототипа, как обеспечить последовательный вызов 
:(
    Опции темы
rene
Дата 1.8.2007, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 31.10.2006
Где: г. Висагинас, р. Литва

Репутация: нет
Всего: нет



Задача: обеспечить вызов сначала  метода-конструктора унаследованного объекта-конструктора,
а затем собственного метода-конструктора. В случае, если объект-конструктор не наследует
другой объект-конструктор не пытаться вызывать коструктор  прототипа.

Есть два объекта-конструктора А и B. Каждый из них содержит в себе публичный метод "construct",
который вызывается при создании экземпляра объекта-конструктора с параметром "id",
то есть:

Код

b = new B(123)

приведёт к тому, что при создании "b" вызовется метод конструктора "construct".

А если унаследовать "А"
Код

B.prototype = new A()

, то 
нужно вызвать метод-конструктор "А", а зетем свой собственный
метод-конструктор.

Сделал вот так, но работает только в Мозилле, так как в ней есть свойство "constructor.name":

Код

function A(id)
{
    this.construct = function(id)
    {
        alert("Called A.constructor")
    }
    if(id)
        this.construct(id)
}

function B(id)
{
    this.name = "B"
    this.construct = function(id)
    {
        if (this.constructor.name != this.name)
            this.constructor(id)
        alert("Called B.constructor")
    }
    if(id)
    {
            this.construct(id)
    }
}

B.prototype = new A()
var b = new B(1)


Как быть?




Это сообщение отредактировал(а) rene - 1.8.2007, 09:54
PM MAIL ICQ   Вверх
rene
Дата 1.8.2007, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 31.10.2006
Где: г. Висагинас, р. Литва

Репутация: нет
Всего: нет



Вот так работает всюду, но как-то неизящно:

Код

function A(id)
{
    this.selfName = "A"
    this.construct = function(id)
    {
        alert("Called A.constructor")
    }
    if(id)
        this.construct(id)
}

function B(id)
{
    this.construct = function(id)
    {
        if (this.selfName == "A")
            this.constructor(id)
        alert("Called B.constructor")
    }
    if(id)
    {
            this.construct(id)
    }
}

B.prototype = new A()
var b = new B(1)



Это сообщение отредактировал(а) rene - 1.8.2007, 10:10
PM MAIL ICQ   Вверх
Zeroglif
Дата 1.8.2007, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



rene, 

внутри функции B вызвать:

Код

    B.prototype.construct();
    this.construct();

первую строчку естесственно вызывать при наличии таковой функции в прототипе (с проверкой), иначе только вторую. Если же идея в том, чтобы привязаться к this, то сразу же при входе в функцию B (ещё до заведения собственных слотов):

Код

if (this.construct) this.construct();

а потом уже завести собственный construct и вызвать. Или я не понял затею?
PM MAIL WWW   Вверх
rene
Дата 1.8.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 31.10.2006
Где: г. Висагинас, р. Литва

Репутация: нет
Всего: нет



конгениально smile
да, идея была сделать это через "this".
но оба решения мне нравятся. спасибо.
>ещё до заведения собственных слотов
ага,  значит потом метод перезапишется собствененным методом "construct" B?
PM MAIL ICQ   Вверх
Zeroglif
Дата 1.8.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(rene @  1.8.2007,  12:52 Найти цитируемый пост)
значит потом метод перезапишется собствененным методом

Скорее не перезапишется, а затенит/закроет наследуемый метод с тем же именем. Сначала, ввиду отсутствия явно заданного слота, объект b не может обработать сообщение и делегирует его своему прототипу (тому который создан через new A). Потом вы заводите явный слот, в следующий раз сообщение будет обработано уже самим получателем.

А в вашем последнем примере беда в том, что, вызывая this.constructor() вы перезаписываете (именно перезаписываете) собственные слоты объекта b, потому что он передаётся в A контекстной переменной. В результате одна и та же функция будет жить и в объекте и в его прототипе, проверим:

Код

b.construct();     //-> Called A.constructor (собственный слот)
delete b.construct 
b.construct();     //-> Called A.constructor (наследуемый слот)

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0790 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.