Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему не работает код? Вопрос о this.constructor. (https://javascript.ru/forum/misc/31272-pochemu-ne-rabotaet-kod-vopros-o-constructor.html)

FINoM 31.08.2012 21:57

Почему не работает код? Вопрос о 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.

Dim@ 31.08.2012 22:06

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();

FINoM 31.08.2012 22:13

Цитата:

Сообщение от 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

FINoM 31.08.2012 22:16

Что характерно:
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 );

Dim@ 31.08.2012 23:13

Цитата:

Сообщение от 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. спасибо за тему - кое что из неё я усвоил :thanks:

9xakep 31.08.2012 23:59

Цитата:

Сообщение от Dim@
что при создании объекта что то летает по внутренностям добавляя свойства и методы

прости что?

nerv_ 01.09.2012 01:17

Цитата:

Сообщение от FINoM
Так, кстати, тоже не работает:

у Фленагана ошибка?
Цитата:

Во-вторых, объект наследует свойства, даже если они были добавлены в прототип после создания объекта. Это означает наличие возможности добавлять новые методы к существующим классам

FINoM 01.09.2012 01:20

Цитата:

Сообщение от nerv_
у Фленагана ошибка?

Тут неоднозначно написано:
Цитата:

Сообщение от nerv_
были добавлены в прототип после создания объекта

Я ведь прототип переопределил, а не добавил новое свойство.

nerv_ 01.09.2012 01:25

Цитата:

Сообщение от 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();

nerv_ 01.09.2012 13:10

Цитата:

Сообщение от FINoM
Так, кстати, тоже не работает:

http://learn.javascript.ru/task/prot...osle-sozdaniya

Цитата:

Сообщение от FINoM
Я ведь прототип переопределил, а не добавил новое свойство.

Цитата:

Сообщение от nerv_ (Сообщение 202164)
твоя правда
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

думаю, тему можно закрывать.


Часовой пояс GMT +3, время: 21:35.