|
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 прототипу НЕОБХОДИМО иметь ПРАВИЛЬНУЮ ссылку на свой конструктор, чтобы не нарушалась взаимосвязь объектов и правильно работало НАСЛЕДОВАНИЕ |
Цитата:
function a() {}; alert(a.prototype instanceof Object) //true Почему это не объект? Цитата:
function Animal() { this.name = 'имя по умолчанию' this.type = 'По умолчанию - медведь' } var bear = new Animal(); /* Вид bear: { name: 'имя по умолчанию', type: 'по умолчанию медведь' } */ alert(bear.name); alert(bear.type); bear.name = 'Изменяем имя у bear' alert(bear.name) // изменили ( в prototype - нет ) /* Смысл в том, что в прототипе содеражться ССЫЛКИ на свойства конструктора, а ново созданом объекте все приватное (мы изменили имя, но в прототипе оно не изменилось) */ Цитата:
function a() {} // Если читали про прототипы вообще, то знаете, что единственное свойство которое есть у прототипов при созданию, это constructor, в твоем коде, ты его меняешь. (опустошаешь, и меняешь) Про последнее уже не знаю. P.S. мог что-то неправильно сказать, так что...почитай еще) |
Переформулировал вопросы, чтобы было яснее, о чем речь )
|
Цитата:
Как только нужное свойство находится, оно вызывается с объектом o в качестве this. |
Цитата:
|
almac,
Дэвид Флэнанган: Прототипом объекта является значение свойства prototype функцииконструктора. Все функции имеют свойство prototype, которое ини циализируется в момент определения функции. Вот что я пытался сказать) (с. 164я. 5ое издание) |
Цитата:
|
almac,
Может я тупость сморожу: Потому что так сделали создатели языка :blink: |
Цитата:
function f(){} alert(f.prototype.__proto__.constructor===Object);//true Другой вопрос, что у этого Object() ещё создаётся свойство constructor, которое желательно возвращать прототипу при перезаписи. |
almac,
Вот еще можете в опере, dragon fly, побаловаться: ![]() |
Часовой пояс GMT +3, время: 05:10. |
|