| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > И снова объекты! |
| Автор: maxkazar 11.10.2004, 11:05 | ||||||
| Как сделать наследование в объектах JScript Я попробывал сам и вот что получилось
при выполнении скрипта получаем следующее
Вобщемто все работает (метод create наследуеться)... вот только мне не нравиться что из метода необходимо сылаться через имя класса на метод класса
естли какие предложения как сделать наследование красивым) |
| Автор: ElectricalStorm 11.10.2004, 16:04 | ||||
есть 1. Вам надо хорошенько подумать над code style... 2. Смотри пример
|
| Автор: Sardar 11.10.2004, 21:54 | ||||||||||
maxkazar код от начала и до конца правильный Осталось только понять что конкретно происходит. В JS нет классов(мы пока не расматриваем JS2), это обьектно-прототипный язык. Это значит что все кроме примитивных типов есть обьекты, от обьектов порождаются другие обьекты, на практике создать обьект можно только от обьекта Function. У каждого обьекта есть конструктор - обьект функция, т.е. этот код:
Создаст еще один обьект от myObject. У функций есть свойство prototype, задающее интерфейс всем обьектам созданным от этой функции. Сказанное выше и это формирует понятие обьектно-прототипный язык. Тут есть несколько моментов:
Я не знаю что ты считаешь красивым
Покажет нам что в this.constructor лежит ссылка на функцию a! Полнейший бред но это так(во всех браузерах), так что this.constructor.create(), как если бы b была бы нашим конструктором, ты не можешь. Так что тво способ верный и не стоит морочить себе голову Кстати JS это очень гибкий, без жестких типов язык, что бы потребовалось наследование с переопредлением методов встречаю в первый раз Пиши проще, для этого JS и придумывался, а наследование и типы оставь для Java.
Странное замечание... И еще заинтересовал пример с приватным методом, как и ожидал он не работает На самом деле создается функция существующая в момент работы конструктора BaseClass, после его завершения функция уничтожается. |
| Автор: ElectricalStorm 12.10.2004, 09:48 | ||||||||
| Sardar мне кажется Вы что-то не допонимаете Если взять за основу мой пример то становиться все понято
и тогда абсолютно понятно почему вот такой пример работает правильно
что здесь странного - очень коряво написаый код
Еще как работает. Эту функцию можно использывать внутри класса... так же как это делается во всех ОО языках |
| Автор: Sardar 12.10.2004, 19:56 | ||||||||||
Ваш код ни о чем не говорит и не понятно что вы считаете правильным. У меня не малый опыт с 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 спасибо за это уточнение. |
| Автор: ElectricalStorm 13.10.2004, 09:30 | ||
Вы утверждаете что ООП в javascript нет а я говорю что есть пересказывать мануал не буду дам ссылку http://www.codeproject.com/aspnet/JsOOP1.asp |
| Автор: Sardar 13.10.2004, 23:56 | ||
Я этого не утверждал, если у вас наличие классов ассоциируется только с ООП языками(что верно Не знал о возможностях инкапсуляции. Но это по сути сохранение контекста родительской функции и установка его выше по вложенности для обьекта, а я думал что контекст уничтожается. Обьекты продолжают быть хешьтаблицами с воможностью динамического создания/удаления полей, контексты это тоже хешьтаблицы. 2All советую прочесть статью, много полезного. |
| Автор: maxkazar 1.11.2004, 10:05 | ||
| Столкнулся со следующей проблемой Пробую сделать следующую иерархию A | B / \ C D ну в коде приблизительно следующие
Так вот, если мы сделаем два класса C и D и вызовем у них метод ShowTest то получим один и тотже результат. В принципе все верно, контекс объекта A создаеться один лишь раз для объекта B, соответсвенно и для C и D((((. Опять рушиться обектный подход(((. Что делать и как быть? Ломаю голову не первый день. |
| Автор: Sardar 1.11.2004, 11:13 | ||
Где рушится? Наследование не может урезать интерфейс, только расширить |
| Автор: maxkazar 1.11.2004, 11:30 |
| Получаеться что пременая Test будет одна для объектов C и D т.е. если я изменю значение Test в объекте D то и изменится значение Test в объекте C!!!(((. А это неправильно |
| Автор: Sardar 1.11.2004, 14:07 | ||
Переменная Test является приватной и принадлежит только А, никакими способами кроме интерфейса А ты на переменную воздействовать не можешь. В JavaScript нет классов, т.е. нет наследования от класса(от типа) как например в C++ или Java. То есть нет понятия: при создании обьекта вначале автоматом создаются все его предки. В JavaScript есть только обьекты, порожденные некоторой функцией и имеющие интерфейс создаваемой этой функцией + интерфейс обьекта в прототипе(изначально прототип это пустой обьект). Обьект в прототипе не копируется! Значит это верно что все обьекты наследуемые B имеют одинаковые переменные A созданной для B. А все потому что JavaScript это не Java, это обьектно прототипный язык, позволяющий писать как в директивном так и в ООП стиле. Это идеально для не больших скриптов, которыми скрипты в страничке и являются. Ты просто представь себе огрменные библиотеки классов для создания roll over эффекта P.S. я пишу на JS, QVB и нa Java - все три языка относятся к различным парадигмам |