Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript (http://www.flasher.ru/forum/forumdisplay.php?f=5)
-   -   Вопрос по Робину Дебройлу (ООП) (http://www.flasher.ru/forum/showthread.php?t=51735)

Whatsername 20.11.2003 16:05

Вопрос по Робину Дебройлу (ООП)
 
Код:

Pet = function( name )
{
    this.name = name;
}
Pet.prototype.legs = 4;
Pet.prototype.pet = true;

Dog = function( name ){

        this.$_base = Pet;
        this.$_base (name);
        delete (this.$_base);

}
Dog.prototype.__proto__ = Pet.prototype;
Dog.prototype.price = 10;

rover  = new Dog( "Rover" );

for(var i in rover){ trace( i + ":\t" + rover[i] ) }


Подскажите, пожалуйста, как rover получает свойство name.
Я не понимаю как работает:

this.$_base = Pet;
this.$_base (name);
delete (this.$_base);

Почему просто this.Pet (name); - не читает? Что передается в случае this.Pet (name); ?

Nox Noctis 20.11.2003 16:20

зачем так хитро ? :)
Код:

Pet = function (name) {
        this.name = name;
};
Pet.prototype.legs = 4;
Pet.prototype.pet = true;
Dog = function (name) {
        Pet.apply(this, [name]);
};
Dog.prototype.__proto__ = Pet.prototype;
Dog.prototype.price = 10;
rover = new Dog("Rover");
for (var i in rover) {
        trace(i+":\t"+rover[i]);
}

и вся эта заморочка с созданием и удалением this.$_base нужна была только для того чтобы в качестве this внутри функции Pet был тот же объект, который в качестве this внутри функции Dog.

Пушистик 20.11.2003 16:26

Цитата:

Подскажите, пожалуйста, как rover получает свойство name.
наследование свойств от класса/создание надкласса:

Dog.prototype.__proto__ = Pet.prototype;

Цитата:

Почему просто this.Pet (name); - не читает? Что передается в случае this.Pet (name); ?
чё это ваще за синтаксис такой? :confused:

обычно чатаются свойства от созданных объектов на основе класса!
в данном случае - это rover!

trace(rover.legs);


после создания надкласса можно проверить что Dog получил все свойства:

myDog = new Dog();
trace(myDog.legs);


Цитата:

Я не понимаю как работает:

this.$_base = Pet;
this.$_base (name);
delete (this.$_base);

сам до конца не понимаю!:)определение надкласса как метода Dog с передачей аргумента - это понятно для чего!


но для чего потом delete (this.$_base); мне не понятно!:)

Пушистик 20.11.2003 16:28

О!теперь понятно! :D

Whatsername 20.11.2003 16:44

Nox Noctis и Пушистик - спасибо большое :)
Сейчас буду осмыслять...

Whatsername 20.11.2003 19:22

Dear Nox Noctis и Пушистик,
если разбирать

this.$_base = Pet;
this.$_base (name);
delete (this.$_base);

1) rover получает свойство $_base со значением Pet (это что, правда такое значение может быть?)
2) rover вызывает метод Pet, передавая параметр name.
3) Pet навешивает на rover свойство name со значением параметра.
4) this.$_base удаляется как больше не нужный.

Верно?

Тогда почему нельзя написать просто this.Pet (name); ?

Nox Noctis 20.11.2003 19:29

потому что в классе Dog НЕТУ такого метода - Pet...

я вообще-то не очень понимаю что имел в виду дебройль, написав такую запутку... не понятно зачем :) (можно цитату из книги ?)

получается что ты временно содаешь метод в объекте класса Дог, потом после его вызова тут же его удаляешь...

и при этом еще используешь прототип класса Pet как родительский для Dog... хотя только что использовал Pet как непонятно что, а не по оопшному назначению...

короче фигня какая-то.
все работает, это да, но нафига так ? :))

iLoveYou 20.11.2003 19:55

ааа.. дебройлевские примеры "Жизнь вокруг нас"...
на вскидку:
Dog = function( name ){
this.$_base = Pet;
this.$_base (name);
delete (this.$_base);
}
Dog.prototype.__proto__ = Pet.prototype;
это есть вызов для данного объекта конструктора родительского класса с передачей ему параметра; свойство name в Pet назначается и наследуется объектом класса Dog при его создании.
все, конечно, очень условно, пример явно не слишком удачный. но это Дебройль -- -->обучение принципам. может, кто поправит?

Whatsername 20.11.2003 20:00

Nox Noctis,
Цитата:

я вообще-то не очень понимаю что имел в виду дебройль, написав такую запутку... не понятно зачем :) (можно цитату из книги ?)
Цитата:

Примечание

Конструктор фактически ничего не знает о каждом конкретном экземпляре, однако он догадывается о том, что с помощью оператора new создается новый безымянный объект. Проще говоря, он "думает", что this указывает на некий объект, который будет создан.



Мы знаем, что this в конструкторе Dog указывает на его воплощение - rover (см. Примечание). Мы также знаем, что когда объект вызывает метод, this в методе указывает на вызывающий объект. Что нам мешает превратить Pat в метод экземпляра rover и запускать его оттуда? Другими словами, rover будет заключать в себе код конструктора Pet как одно из своих свойств и мы просто попросим rover запустить свой же метод. Давайте скажем это в третий раз: rover съел, проглотил Pet и теперь он внутри него, оттуда мы его и запустим. Теперь, когда метод(!) Pet запустится, this будет указывать на rover, поэтому все свойства, добавленные через this, добавляются к rover. Когда метод Pet отработает, он нам уже будет ни к чему, его смело можно удалить. Причем, нам совершенно не обязательно называть его Pet, его код должен быть таким же, а имя может быть любым. Таким любым, что вы должны быть абсолютно уверены в том, что нигде его не используете в программе как свойство объекта, ведь мы его совсем скоро удалим. Вполне подойдет имя $_base (просто base не подойдет, иначе все ваши base будут лежать в мусорной корзине).
Цитата:

и при этом еще используешь прототип класса Pet как родительский для Dog... хотя только что использовал Pet как непонятно что, а не по оопшному назначению...
Pet - я еще использую как, типа, метод для экземпляров Dog.

iLoveYou 20.11.2003 20:06

да, я не мог сказать так красноречиво, как Дебройль =))))
то, что написано, по-моему, все объясняет и раскладывает по полочкам.
dm_nev, может, мы тебе с чем-то конкретным поможем? какая проблема-то? :)


Часовой пояс GMT +4, время: 02:34.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.