Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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. Причина: переформулировка вопроса
Ответить с цитированием
  #2 (permalink)  
Старый 07.07.2012, 12:45
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

Сообщение от almac
1. Почему прототип объекта не является простым Object?
Пример (тут он явно не просто Object):
function Obj() {}; Obj.prototype;
function a() {}; 
alert(a.prototype instanceof Object) //true

Почему это не объект?
Сообщение от almac
2. В чем разница между прототипом и экземпляром объекта? В консоль они выводятся почти как один и тот же объект (выглядят так, как будто были созданы при помощи одного и того же конструктора)
Пример:
function Obj() {}; var o = new Obj(); o; Obj.prototype;
Смотри:
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 - нет )
/* Смысл в том, что в прототипе содеражться ССЫЛКИ на свойства  конструктора, а ново созданом объекте все приватное (мы изменили имя, но в прототипе оно не изменилось)
*/

Сообщение от almac
3. Зачем задавать конструктор для прототипа при ПЕРЕзаписи прототипа?
Пример:
function Obj() {}; Obj.prototype = {}; Obj.prototype.constructor = Obj;
Это уже смотрите задачу, так пример не приведу сходу. Дело в том, что:
function a() {} // Если читали про прототипы вообще, то знаете, что единственное свойство которое есть у прототипов при созданию, это constructor, в твоем коде, ты его меняешь. (опустошаешь, и меняешь)

Про последнее уже не знаю.
P.S. мог что-то неправильно сказать, так что...почитай еще)
__________________
оляля, ололо

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

Переформулировал вопросы, чтобы было яснее, о чем речь )
Ответить с цитированием
  #4 (permalink)  
Старый 07.07.2012, 13:01
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Сообщение от almac
function MyObject() {}; var o = new MyObject(); o.toString();
Ищется свойство toString у объекта o. Если его у него нет — оно ищется у прототипа. У прототипа оно ищется по той же схеме: если у самого объекта прототипа его нет, то смотрится его прототип (прототип прототипа, т.е.) и так далее, пока прототипы есть. В конечном итоге мы дойдём до Object.prototype, чей прототип null.
Как только нужное свойство находится, оно вызывается с объектом o в качестве this.
Ответить с цитированием
  #5 (permalink)  
Старый 07.07.2012, 13:06
Аспирант
Отправить личное сообщение для almac Посмотреть профиль Найти все сообщения от almac
 
Регистрация: 29.06.2012
Сообщений: 31

Сообщение от B@rmaley.e><e
В конечном итоге мы дойдём до Object.prototype, чей прототип null.
Вот это самое важное, что мне нужно было понять. Спасибо! Остается еще 2 неотвеченных вопроса в топике )

Последний раз редактировалось almac, 07.07.2012 в 13:11.
Ответить с цитированием
  #6 (permalink)  
Старый 07.07.2012, 13:12
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

almac,
Дэвид Флэнанган:
Прототипом объекта является значение свойства prototype
функцииконструктора. Все функции имеют свойство prototype, которое ини
циализируется в момент определения функции.

Вот что я пытался сказать) (с. 164я. 5ое издание)
__________________
оляля, ололо
Ответить с цитированием
  #7 (permalink)  
Старый 07.07.2012, 13:16
Аспирант
Отправить личное сообщение для almac Посмотреть профиль Найти все сообщения от almac
 
Регистрация: 29.06.2012
Сообщений: 31

Сообщение от 9xakep Посмотреть сообщение
almac,
Дэвид Флэнанган:
Прототипом объекта является значение свойства prototype
функцииконструктора. Все функции имеют свойство prototype, которое ини
циализируется в момент определения функции.

Вот что я пытался сказать) (с. 164я. 5ое издание)
Да, это ясно что у конструктора есть свойство prototype. Интересует как именно происходит инициализация и почему в prototype присваивается не простой Object(), а конструктор прототипа, хотя Стефанов писал кажется про "простой объект"
Ответить с цитированием
  #8 (permalink)  
Старый 07.07.2012, 13:20
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

almac,
Может я тупость сморожу:
Потому что так сделали создатели языка
__________________
оляля, ололо
Ответить с цитированием
  #9 (permalink)  
Старый 07.07.2012, 13:24
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от almac
Почему прототип объекта не создается при помощи конструктора Object? Непонятно вообще, как он создается (прототип)
Пример (тут он явно не просто Object())
Вы ошибаетесь
function f(){}
alert(f.prototype.__proto__.constructor===Object);//true


Другой вопрос, что у этого Object() ещё создаётся свойство constructor, которое желательно возвращать прототипу при перезаписи.

Последний раз редактировалось Раед, 07.07.2012 в 13:26.
Ответить с цитированием
  #10 (permalink)  
Старый 07.07.2012, 13:43
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

almac,
Вот еще можете в опере, dragon fly, побаловаться:
__________________
оляля, ололо
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34
JavaScript: ООП Ars_Art Общие вопросы Javascript 13 09.02.2010 02:32