![]() |
Вопрос по Робину Дебройлу (ООП)
Код:
Pet = function( name )Подскажите, пожалуйста, как rover получает свойство name. Я не понимаю как работает: this.$_base = Pet; this.$_base (name); delete (this.$_base); Почему просто this.Pet (name); - не читает? Что передается в случае this.Pet (name); ? |
зачем так хитро ? :)
Код:
Pet = function (name) { |
Цитата:
Dog.prototype.__proto__ = Pet.prototype; Цитата:
обычно чатаются свойства от созданных объектов на основе класса! в данном случае - это rover! trace(rover.legs); после создания надкласса можно проверить что Dog получил все свойства: myDog = new Dog(); trace(myDog.legs); Цитата:
но для чего потом delete (this.$_base); мне не понятно!:) |
О!теперь понятно! :D
|
Nox Noctis и Пушистик - спасибо большое :)
Сейчас буду осмыслять... |
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); ? |
потому что в классе Dog НЕТУ такого метода - Pet...
я вообще-то не очень понимаю что имел в виду дебройль, написав такую запутку... не понятно зачем :) (можно цитату из книги ?) получается что ты временно содаешь метод в объекте класса Дог, потом после его вызова тут же его удаляешь... и при этом еще используешь прототип класса Pet как родительский для Dog... хотя только что использовал Pet как непонятно что, а не по оопшному назначению... короче фигня какая-то. все работает, это да, но нафига так ? :)) |
ааа.. дебройлевские примеры "Жизнь вокруг нас"...
на вскидку: Dog = function( name ){ this.$_base = Pet; this.$_base (name); delete (this.$_base); } Dog.prototype.__proto__ = Pet.prototype; это есть вызов для данного объекта конструктора родительского класса с передачей ему параметра; свойство name в Pet назначается и наследуется объектом класса Dog при его создании. все, конечно, очень условно, пример явно не слишком удачный. но это Дебройль -- -->обучение принципам. может, кто поправит? |
Nox Noctis,
Цитата:
Цитата:
Цитата:
|
да, я не мог сказать так красноречиво, как Дебройль =))))
то, что написано, по-моему, все объясняет и раскладывает по полочкам. dm_nev, может, мы тебе с чем-то конкретным поможем? какая проблема-то? :) |
2Sergey"iLoveYou"
сергей, с примером уже разобрались давно :) вопрос только зачем он такой странный :) 2dm_nev аа... ну вот. я тебе это и сказал только не так подробно... но, имхо, этот пример все только запутывает... я думаю надо было показать наследование отдельно а вписывание методов отдельно... (хотя кто я такой чтобы ему советовать :)) ) |
Цитата:
Я что-то совсем запутался... :eek: Скажите просто что делает строчка Код:
this.$_base = Pet; |
2 Nox Noctis, уже разобрались?
Цитата:
Nox Noctis, я понимаю, что у тебя чувство, будто ты седьмой раз мне одно и тоже повторяешь, но я ей-ей не понимаю. |
спасибо
Ребята, тут все это знают, но я скажу еще раз:
Код:
this.$_base = Pet;Все верно? Спасибо большое :D |
хмм... ну все же написано уже :)
а у дебройля вообще длинно и подробно разжевано... смотри: Код:
Pet = function (name) {в конструкторе Дог смотрим видна ли функция (ЭТО НЕ МЕТОД) Pet в данной области видимости имен. потом проверяем то же самое для this.Pet... this.Pet естесственно не видна. если бы мы сделали так: Код:
Pet = function (name) {а в примере дебройля именно это и происходит.. мы добавляем к экземпляру класса Дог метод Пет.. просто потом его сразу удаляем после использования. |
Nox, понятно :)
меня пример смутил наличием Dog.prototype.__proto__ = Pet.prototype; вопрос, оказывается, в другом был. :) |
Спасибо большое, Nox Noctis ты мне очень помог. Я наконец-то понял как это работает. Метод - просто свойство, принадлежащее классу, иначе он (метод) работать не будет.
Хотя я встречал исходники, где определяется функция (метод), а потом к ней (к нему) обращаются все кто захочет - любые переменные. Например в первом кадре определяется метод formatbytes (bytes); для форматирования bytes в дружественный размер (57 Kb, 1.3 Mb), а во втором кадре левая переменная, содержащая getBytesLoaded (); обращается к formatbytes (bytes); и все работает! Это не против правил ООП? Ведь переменная, содержащая getBytesLoaded (); не имеет метода formatbytes (); в своем свойстве. Если я что-то напутал, то я уверен, что все равно соображу - рано или поздно. А вот если ты уже засыпаешь читая мои вопросы - забудь. Спасибо большое. :) |
Цитата:
Цитата:
ладно фиг с ними с формулировками, главное чтобы ты сам понимал что сказал :)) методом называется функция, ссылка на которую хранится внутри объекта. блягодаря тому что она вызывается из объекта, указатель this указывает на объект из которого она вызвана. но функция может и не быть привязана к объекту. можно вызывать функцию саму по себе. например проверь: Код:
test = function () {если ты определяешь функцию без указания объекта в котором ее прописываешь, то она автоматически становится МЕТОДОМ того мувиклипа в котором находится код. например, если напишем в руте: function test () { // ... } то тест станет методом рута. и this внутри нее будет указывать на _левел0 |
Dear Nox Noctis, я решил больше ничего не писать в этом топике пока не стану супер ООПером (ужас), чтобы не нервировать тебя и людей, незаслуживающих такого непонимания с моей стороны...
Спасибо большое тебе (и не только тебе)... ребята, наверное мне нужно больше почитать книг "мы купили комьютер" или "видоус для чайников", так как я пребываю в полной уверенности, что this в методе DOG указывает на rover (будущий экземпляр DOG), и будучи полноценным экземпляром - может вызывать методы, в том числе PET. Спасибо ребята, я все распечатал и обязательно осилю - ваша помощь не напрасна :) |
гррррр... :))
в этом примере ПЕТ ЭТО НЕ МЕТОД КЛАССА ДОГ понимаешь ? :) в описании класса нету такого метода. его ВРЕМЕННО делают методом объекта РОВЕР (в результате чего, как ты и сказал, this внутри Pet'а указывает на ровера) но если бы этого не сделали (всей этой ботвы с переменной $_base) то внутри Pet'а this указывал бы на _level0, где и прописан изначально... |
Ага, Nox Noctis, именно поэтому в прототипе класса нужно указывать методы к которым экземпляры этого класса могут обращаться?
Иначе для в каждом классе придется создавать такой вот $_base... |
Я понял:
у Ровера нет ПЕТ У this в ДОГе нет ПЕТ словом - у ДОГа нет ПЕТ. (именные пространства (область видимости), это так называется?) Боже, как хорошо, что у ДОГа нет ПЕТ :D Спасибо, Nox Noctis, сила_твоего_духа = истина; :D Спасибо. |
настоящий джыдай :)
да пребудет с тобой Сила... :) |
назад в будущее
Nox Noctis, я сегодня получил ответ от Дебройля :eek:
Посмотри-ка: полный undefined :confused: Цитата:
|
ну вооот :) все то же самое... тлько тут он еще дополнил примером с super()
вот это как раз правильное наследование. а вариант когда функцию делают методом - это тоже способ добиться того же результата, но никакого там наследования нет :) в книге он немного смешал оба варианта... то есть наследование и "не-наследование" :) |
Код:
Guru = function (name) { |
ааа... ты вот о чем...
у блин :) а я в конце рабочего дня не понял нифига.. похоже, тут маэстро слегка лажанулся... когда пишешь то что хорошо знаешь, очень лениво проверять что написал, это понятно :)) я думаю, он хотел сказать так: Код:
Guru = function (name) { |
и с супером он тоже того... мимо кассы... :)
super без указания имени метода должен вызвать такой же метод в над-классе... то есть в над-классе, в его коде, должен бы вызваться метод Guru.prototype.Pro... но его там, увы, нет :) Код:
Guru = function () {как врубишься - отправь ему ответ с комментариями :) а то вдруг мы не догнали какой-то хитрой задумки на самом деле... :)) |
Да, Nox Noctis, обязательно сообщу о результатах.
Во как бывает, ё-моё :D |
Nox Noctis, теперь Он тоже знает как это работает :)
Цитата:
|
ну вот, сразу видно человек опохмелился правильно :)))
|
нет для тебя авторитетов :D
|
| Часовой пояс GMT +4, время: 04:53. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.