![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| Megas |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 15.1.2006 Репутация: нет Всего: нет |
Работая над одним проектом обнаружил для себя странное поведение при работе с переменными родительского класса.
Допустим у нас есть некий родительский класс:
Как видно у него две внутренние переменные: одно числовое, а другое массив. И пара функций для работы с каждой из переменных. Теперь определим класс наследник:
Я не гуру javascript'а, поэтому для меня было большим удивлением, что переменная-массив является общей для всех объектов класса ChildObj, в то время как вторая переменная каждая своя у каждого объекта. Вот пример кода:
Я прочитал много различных статей про ООП в javascript'е, но нигде не описывалась подобная проблема. Ктото может объяснить почему такое происходит? Или дать ссылку на какуюто хорошую статью описывающую данную проблему? И как эту проблему можно решить не прибегая к объявлении такой же переменной в классе наследника? |
||||||
|
|||||||
| Arantir |
|
||||
|
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 14 Всего: 55 |
О чем-то говорит? =) Это сообщение отредактировал(а) Arantir - 3.12.2012, 13:31 -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
||||
|
|||||
| Megas |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 15.1.2006 Репутация: нет Всего: нет |
Arantir, т.е. ты предлагаешь просто заменить массив на null? Это больше похоже на костыль, чем на нормальное решение.
А почему это происходит, не вкурсе? |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 0 Всего: 101 |
||||
|
||||
| CruorVult |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 868 Регистрация: 24.9.2008 Где: г.Киев, Украина Репутация: 13 Всего: 28 |
Array(он же Object) - ссылочный тип, а String, Number - нет.
|
|||
|
||||
| Megas |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 15.1.2006 Репутация: нет Всего: нет |
baldina, CruorVult, спасибо. Тоже уже догодался, что именно в этом дело.
|
|||
|
||||
| Arantir |
|
||||
|
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 14 Всего: 55 |
Я предлагаю каждому потомку создавать собственный массив автоматически в родителе. Можете поставить там ноль! Можете хоть поставить там "Hello world!"! null просто не сбивает с толку, мол что это за число или что за строка. Представьте себе, даже вот это работает:
При желании вы можете в родителе вписать в объявление даже готовый заполненный массив. Место объявления осталось одним-единственным. Но у каждого потомка будет свой независимый массив. Где тут "костыль", не пойму никак... По-моему, это называется "отложенная инициализация". Ну ладно, я инициализировал ее в null. Но вы можете свободно оставить ее неинициализированной и проверять ее тип на undefined. Суть метода-то не в этом. Это сообщение отредактировал(а) Arantir - 3.12.2012, 20:03 -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
||||
|
|||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Megas, Дело просто в другой схеме "наследования". Точнее - своей собственной, прототипной
В нормальной схеме есть класс - "разметка" будущего участка отведенных для объекта рессурсов под методы и атрибуты. а в прототипной - существует ссылка на другой объект - прототип. Когда запрашивается атрибут от this, смещаемся по списку прототипов "вниз", а не лезем в несуществующую в JS таблицу классов. Некое просветление наступает, когда осознаешь, что прототипы можно менять на лету, тем самым получая себе доступ к свойствам самых странных объектов. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| CruorVult |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 868 Регистрация: 24.9.2008 Где: г.Киев, Украина Репутация: 13 Всего: 28 |
Я бы посоветовал почитать книжку Object-Oriented JavaScript By Stoyan Stefanov. Все вопросы сразу пропадут
Там описано 12 способов наследования Это сообщение отредактировал(а) CruorVult - 4.12.2012, 12:30 |
|||
|
||||
![]()
|
| Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |