Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.08.2012, 21:57
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Почему не работает код? Вопрос о this.constructor.
Есть всем известный самый простой вариант наследования:
X = function() {}
Y = function() {}
X.prototype.method = function() {alert( "ок" )};
Y.prototype = new X;
y = new Y;
y.method();
Здесь мы присваиваем прототипу Y объект, полученный из конструктора X. Всё логично.

По умолчанию, если мы не используем наследование, то в объекте свойство constructor хранит ссылку на свой конструктор (кэп).
Y = function() {};
y = new Y;
alert( y.constructor === Y );


Но, если мы делаем финт ушами и меняем прототип Y через свойство constructor, ничего из X не наследуется:
X = function() {}
Y = function() {}
X.prototype.method = function() { alert( 'ок' ) };
y = new Y;
alert( y.constructor === Y );
y.constructor.prototype = new X;
alert( y.constructor.prototype === Y.prototype );
y.method();


Почему?

UPD
Так, кстати, тоже не работает:
X = function() {}
Y = function() {}
X.prototype.method = function() { alert( 'ok' ) };
y = new Y;
Y.prototype = new X;
y.method();


Оказывается, я не знаю Javascript.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности

Последний раз редактировалось FINoM, 31.08.2012 в 22:04.
Ответить с цитированием
  #2 (permalink)  
Старый 31.08.2012, 22:06
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

FINoM,
потому что объект y уже создан и не расширяется прототипом Y зато следующие объекты Y будут иметь метод method
X = function() {}
Y = function() {}
X.prototype.method = function() { alert( 'ок' ) };
y = new Y;
alert( y.constructor === Y )
y.constructor.prototype = new X;
yy = new Y;
yy.method();
Ответить с цитированием
  #3 (permalink)  
Старый 31.08.2012, 22:13
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сообщение от Dim@
потому что объект y уже создан и не расширяется прототипом Y зато следующие объекты Y будут иметь метод method
Это я уже понял. Но, я всегда думал, что, если метод не найден в прототипе конструктора, он будет искать его дальше:
C.prototype.method > не найден
C.prototype.constructor.prototype.method > не найден
C.prototype.constructor.prototype.constructor.prot otype.method ... и так дальше, пока ...prototype.constructor !== ...prototype.constructor.prototype.constructor
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #4 (permalink)  
Старый 31.08.2012, 22:16
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Что характерно:
X = function() {}
Y = function() {}
X.prototype.method = function() { alert( 'ok' ) };
y = new Y;
y.constructor.prototype = new X;
alert( y instanceof Y );
alert( y instanceof X );
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #5 (permalink)  
Старый 31.08.2012, 23:13
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

Сообщение от FINoM
Но, я всегда думал, что, если метод не найден в прототипе конструктора, он будет искать его дальше:
C.prototype.method > не найден
C.prototype.constructor.prototype.method > не найден
C.prototype.constructor.prototype.constructor.prot otype.method ... и так дальше, пока ...prototype.constructor !== ...prototype.constructor.prototype.constructor
Блин я тоже так думал, но после этого убедился что это не так
X = function() {}
Y = function() {}
X.prototype.method = function () { alert( 'ok' ) };
y = new Y;
Y.prototype = new X;
alert( y.method );//undefined
alert( y.constructor.prototype.method );//function () { alert( 'ok' ) }

становиться очевидно что при создании объекта что то летает по внутренностям добавляя свойства и методы только один раз что бы потом не искать прототипе
P.S. спасибо за тему - кое что из неё я усвоил
Ответить с цитированием
  #6 (permalink)  
Старый 31.08.2012, 23:59
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

Сообщение от Dim@
что при создании объекта что то летает по внутренностям добавляя свойства и методы
прости что?
__________________
оляля, ололо
Ответить с цитированием
  #7 (permalink)  
Старый 01.09.2012, 01:17
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от FINoM
Так, кстати, тоже не работает:
у Фленагана ошибка?
Цитата:
Во-вторых, объект наследует свойства, даже если они были добавлены в прототип после создания объекта. Это означает наличие возможности добавлять новые методы к существующим классам
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 01.09.2012 в 01:20.
Ответить с цитированием
  #8 (permalink)  
Старый 01.09.2012, 01:20
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сообщение от nerv_
у Фленагана ошибка?
Тут неоднозначно написано:
Сообщение от nerv_
были добавлены в прототип после создания объекта
Я ведь прототип переопределил, а не добавил новое свойство.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #9 (permalink)  
Старый 01.09.2012, 01:25
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от FINoM
Я ведь прототип переопределил, а не добавил новое свойство.
твоя правда
var X = function() {}
var Y = function() {}
X.prototype.method = function() { alert( 'ok' ) };

var y = new Y;
Y.prototype.method = X.prototype.method;

y.method();
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #10 (permalink)  
Старый 01.09.2012, 13:10
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от FINoM
Так, кстати, тоже не работает:
http://learn.javascript.ru/task/prot...osle-sozdaniya

Сообщение от FINoM
Я ведь прототип переопределил, а не добавил новое свойство.
Сообщение от nerv_ Посмотреть сообщение
твоя правда
var X = function() {}
var Y = function() {}
X.prototype.method = function() { alert( 'ok' ) };

var y = new Y;
Y.prototype.method = X.prototype.method;

y.method();
http://learn.javascript.ru/task/izme...osle-sozdaniya


http://learn.javascript.ru/prototype#свойство-prototype

думаю, тему можно закрывать.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 01.09.2012 в 13:28.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу понять, почему не работает автокомпил в IE 8 gargon2008 jQuery 0 07.06.2011 11:31
Помогите с javascript (Почему не работает) remus Оффтопик 9 09.06.2010 11:18
Калькулятор работает ТОЛЬКО в ie6 (вопрос ламера) st_sinner Javascript под браузер 3 17.04.2010 18:11
Не работает код из внешнего файла в IE6 Petka jQuery 2 03.03.2010 16:09
Почему не работает код? JSprog Общие вопросы Javascript 4 16.08.2009 14:39