Показать сообщение отдельно
  #1 (permalink)  
Старый 07.07.2012, 12:29
Аспирант
Отправить личное сообщение для almac Посмотреть профиль Найти все сообщения от almac
 
Регистрация: 29.06.2012
Сообщений: 31

Javascript: вопросы по ООП
[ТЕМА ЗАКРЫТА. Привожу вопросы и ответы на них]

Были такие ВОПРОСЫ (я их переформулировал кучу раз, но смысл такой):
1. Как создается прототип объекта и как реализовано наследование в Javascript?

2. Зачем задавать свойство constructor для прототипа при ПЕРЕзаписи прототипа, и как работает это свойство в контексте наследования в Javascript?

Ответ на вопрос №1

Пример:
function F() {this.prop1 = 'test'; this.prop2 = 2;};
F.prototype; //это простой объект, который создается автоматически при помощи new Object - у прототипа нет свойств конструктора F
F.prototype.__proto__; // указывает на самый верхний объект Object в Javascript, у которого в своем прототипе определены методы toString(), valueOf() и тд, которыми наследуются ВСЕМИ объектами


Из этого можно сделать следующие выводы:
- в Javascript при создании функции-конструктора F создается объект-прототип (F.prototype) со свойством constructor (ниже поясню зачем оно нужно) и внутренней ссылкой __proto__ - это ссылка на самый верхний Object)
- прототип конструктора F - простой объект Object() (что то типа F.prototype = new Object()); но для правильной работы НАСЛЕДОВАНИЯ в Javascript F.prototype содержит ссылку constructor не на Object, а на F

Ответ на вопрос №2

Пример:
function F(){this.prop1 = 'test'; this.prop2 = 2;};
F.prototype = {test: 1};
var f = new F();
f.constructor; //function Object() { [native code] }
f.constructor.prototype.test; //undefined, так как теперь f.constructor.prototype - это ссылка на прототип самого верхнего объекта Object, смотрите строку выше
F.prototype.constructor = F; // так можно "починить" указанную выше ошибку (так уж устроен Javascript)


Выводы:
- При переОПРЕДЕЛЕНИИ прототипа возникает нарушение взаимосвязи в объектах (f.constructor должен указывать на свой конструктор F, и у этого конструктора есть ссылка на прототип; это очень важно, так как в будущем может привести к ошибкам, если использовать f.constructor
- В Javascript прототипу НЕОБХОДИМО иметь ПРАВИЛЬНУЮ ссылку на свой конструктор, чтобы не нарушалась взаимосвязь объектов и правильно работало НАСЛЕДОВАНИЕ

Последний раз редактировалось almac, 07.07.2012 в 22:18. Причина: переформулировка вопроса
Ответить с цитированием