![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| maxkazar |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 26.1.2004 Где: Таганрог Репутация: нет Всего: нет |
Как сделать наследование в объектах JScript
Я попробывал сам и вот что получилось
при выполнении скрипта получаем следующее
Вобщемто все работает (метод create наследуеться)... вот только мне не нравиться что из метода необходимо сылаться через имя класса на метод класса
естли какие предложения как сделать наследование красивым) |
||||||
|
|||||||
| ElectricalStorm |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 547 Регистрация: 22.1.2004 Репутация: нет Всего: 9 |
есть 1. Вам надо хорошенько подумать над code style... 2. Смотри пример
-------------------- Нужно знать инструмент, которым пользуешься |
||||
|
|||||
| Sardar |
|
||||||||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
maxkazar код от начала и до конца правильный Осталось только понять что конкретно происходит. В JS нет классов(мы пока не расматриваем JS2), это обьектно-прототипный язык. Это значит что все кроме примитивных типов есть обьекты, от обьектов порождаются другие обьекты, на практике создать обьект можно только от обьекта Function. У каждого обьекта есть конструктор - обьект функция, т.е. этот код:
Создаст еще один обьект от myObject. У функций есть свойство prototype, задающее интерфейс всем обьектам созданным от этой функции. Сказанное выше и это формирует понятие обьектно-прототипный язык. Тут есть несколько моментов:
Я не знаю что ты считаешь красивым
Покажет нам что в this.constructor лежит ссылка на функцию a! Полнейший бред но это так(во всех браузерах), так что this.constructor.create(), как если бы b была бы нашим конструктором, ты не можешь. Так что тво способ верный и не стоит морочить себе голову Кстати JS это очень гибкий, без жестких типов язык, что бы потребовалось наследование с переопредлением методов встречаю в первый раз Пиши проще, для этого JS и придумывался, а наследование и типы оставь для Java.
Странное замечание... И еще заинтересовал пример с приватным методом, как и ожидал он не работает На самом деле создается функция существующая в момент работы конструктора BaseClass, после его завершения функция уничтожается. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||||||||
|
|||||||||||
| ElectricalStorm |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 547 Регистрация: 22.1.2004 Репутация: нет Всего: 9 |
Sardar мне кажется Вы что-то не допонимаете
Если взять за основу мой пример то становиться все понято
и тогда абсолютно понятно почему вот такой пример работает правильно
что здесь странного - очень коряво написаый код
Еще как работает. Эту функцию можно использывать внутри класса... так же как это делается во всех ОО языках -------------------- Нужно знать инструмент, которым пользуешься |
||||||||
|
|||||||||
| Sardar |
|
||||||||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Ваш код ни о чем не говорит и не понятно что вы считаете правильным. У меня не малый опыт с JS, если я считаю какую нибудь деталь не удобной, то и правильной я ее считать не буду. Другими примерами недочетов JS например может быть отсутствие методов поиска у массивов. Я повторяю в JavaScript нет классов(супер кллассов и т.п.), потому как нет типов для обьектов. Поле constructor должно содержать ссылку на функцию породившую обьект, что и происходит до присваивания прототипу родительской функии левого обьекта. После присваивания constructor содержит ссылку на функцию, обьект которой мы присвоили в прототипе нашей родительской функции. Я вижу это как недостаток, т.к. нельзя например вызвать метод из унаследованного обьекта, приходится использовать имя родительской функии(как это правильно сделал maxkazar), что не красиво. Если бы constructor не изменялся, то можно было бы легко поднятся по иерархии до унаследованного обьекта. Скорее всего это недоделка нетскаповцев.
Я попрошу вас в будущем воздержатся от таких высказываний. Тем более не обоснованных, они вас не украшают, скорее наоборот
Действительно работает, впрочем ни в одном учебнике такого не видел. Доказал чисто опытным путём. Рассмотрим код:
Замечаем что фнутри вложенной функции нам доступны переменные из контекста выше(что было и раньше когда вы создавали функции в контексте window), переменные определенные в функции являются локальными, потому воздействие на a никак не отражется на a выше по контексту. Заменим a++ на a+1, получили требуемый результат. Что же такое вложенная функция? После работы test мы не можем достигнуть incA: alert(window.incA+", "+test.incA); На самом деле функция уничтожается вместе с контекстом test(), после того как та отработает. Вложенная функция incA это локальный обьект, как и любой другой обьект он должен уничтожится вместе с контекстом. Рассмотрим что происходит при создании обьекта:
Оператор new создает новый контекст, и связывает его с this. Запускается функция, создается ее собственный контекст. Все вызовы/изменения с this воздействуют на контекст созданный оператором new. Обращение к функциям/переменным без this воздействует на контекст функции и высшие контексты. Значит функция incA создается в контексте функции, а этот контекст доступен внутри обьекта при обращении без this. То есть контексты: <window><test: incA><accessPrivate>выше по контексту incA, этот контекст никому не доступен, потому можно считать его приватным для нас</accessPrivate></test></window>. ElectricalStorm спасибо за это уточнение. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||||||||
|
|||||||||||
| ElectricalStorm |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 547 Регистрация: 22.1.2004 Репутация: нет Всего: 9 |
Вы утверждаете что ООП в javascript нет а я говорю что есть пересказывать мануал не буду дам ссылку http://www.codeproject.com/aspnet/JsOOP1.asp -------------------- Нужно знать инструмент, которым пользуешься |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Я этого не утверждал, если у вас наличие классов ассоциируется только с ООП языками(что верно Не знал о возможностях инкапсуляции. Но это по сути сохранение контекста родительской функции и установка его выше по вложенности для обьекта, а я думал что контекст уничтожается. Обьекты продолжают быть хешьтаблицами с воможностью динамического создания/удаления полей, контексты это тоже хешьтаблицы. 2All советую прочесть статью, много полезного. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| maxkazar |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 26.1.2004 Где: Таганрог Репутация: нет Всего: нет |
Столкнулся со следующей проблемой
Пробую сделать следующую иерархию A | B / \ C D ну в коде приблизительно следующие
Так вот, если мы сделаем два класса C и D и вызовем у них метод ShowTest то получим один и тотже результат. В принципе все верно, контекс объекта A создаеться один лишь раз для объекта B, соответсвенно и для C и D((((. Опять рушиться обектный подход(((. Что делать и как быть? Ломаю голову не первый день. |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Где рушится? Наследование не может урезать интерфейс, только расширить -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| maxkazar |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 26.1.2004 Где: Таганрог Репутация: нет Всего: нет |
Получаеться что пременая Test будет одна для объектов C и D т.е. если я изменю значение Test в объекте D то и изменится значение Test в объекте C!!!(((. А это неправильно
|
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Переменная Test является приватной и принадлежит только А, никакими способами кроме интерфейса А ты на переменную воздействовать не можешь. В JavaScript нет классов, т.е. нет наследования от класса(от типа) как например в C++ или Java. То есть нет понятия: при создании обьекта вначале автоматом создаются все его предки. В JavaScript есть только обьекты, порожденные некоторой функцией и имеющие интерфейс создаваемой этой функцией + интерфейс обьекта в прототипе(изначально прототип это пустой обьект). Обьект в прототипе не копируется! Значит это верно что все обьекты наследуемые B имеют одинаковые переменные A созданной для B. А все потому что JavaScript это не Java, это обьектно прототипный язык, позволяющий писать как в директивном так и в ООП стиле. Это идеально для не больших скриптов, которыми скрипты в страничке и являются. Ты просто представь себе огрменные библиотеки классов для создания roll over эффекта P.S. я пишу на JS, QVB и нa Java - все три языка относятся к различным парадигмам -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
![]()
|
| Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |