| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > Странное поведение при работе с переменными протот |
| Автор: Megas 3.12.2012, 13:05 | ||||||
| Работая над одним проектом обнаружил для себя странное поведение при работе с переменными родительского класса. Допустим у нас есть некий родительский класс:
Как видно у него две внутренние переменные: одно числовое, а другое массив. И пара функций для работы с каждой из переменных. Теперь определим класс наследник:
Я не гуру javascript'а, поэтому для меня было большим удивлением, что переменная-массив является общей для всех объектов класса ChildObj, в то время как вторая переменная каждая своя у каждого объекта. Вот пример кода:
Я прочитал много различных статей про ООП в javascript'е, но нигде не описывалась подобная проблема. Ктото может объяснить почему такое происходит? Или дать ссылку на какуюто хорошую статью описывающую данную проблему? И как эту проблему можно решить не прибегая к объявлении такой же переменной в классе наследника? |
| Автор: Arantir 3.12.2012, 13:30 | ||||
О чем-то говорит? =) |
| Автор: Megas 3.12.2012, 15:29 |
| Arantir, т.е. ты предлагаешь просто заменить массив на null? Это больше похоже на костыль, чем на нормальное решение. А почему это происходит, не вкурсе? |
| Автор: CruorVult 3.12.2012, 15:46 |
| Array(он же Object) - ссылочный тип, а String, Number - нет. |
| Автор: Megas 3.12.2012, 15:57 |
| baldina, CruorVult, спасибо. Тоже уже догодался, что именно в этом дело. |
| Автор: Arantir 3.12.2012, 19:53 | ||||
Я предлагаю каждому потомку создавать собственный массив автоматически в родителе. Можете поставить там ноль! Можете хоть поставить там "Hello world!"! null просто не сбивает с толку, мол что это за число или что за строка. Представьте себе, даже вот это работает:
При желании вы можете в родителе вписать в объявление даже готовый заполненный массив. Место объявления осталось одним-единственным. Но у каждого потомка будет свой независимый массив. Где тут "костыль", не пойму никак... По-моему, это называется "отложенная инициализация". Ну ладно, я инициализировал ее в null. Но вы можете свободно оставить ее неинициализированной и проверять ее тип на undefined. Суть метода-то не в этом. |
| Автор: ksnk 3.12.2012, 20:43 |
| Megas, Дело просто в другой схеме "наследования". Точнее - своей собственной, прототипной В нормальной схеме есть класс - "разметка" будущего участка отведенных для объекта рессурсов под методы и атрибуты. а в прототипной - существует ссылка на другой объект - прототип. Когда запрашивается атрибут от this, смещаемся по списку прототипов "вниз", а не лезем в несуществующую в JS таблицу классов. Некое просветление наступает, когда осознаешь, что прототипы можно менять на лету, тем самым получая себе доступ к свойствам самых странных объектов. |
| Автор: CruorVult 4.12.2012, 12:26 |
| Я бы посоветовал почитать книжку Object-Oriented JavaScript By Stoyan Stefanov. Все вопросы сразу пропадут Там описано 12 способов наследования |