Почему не работает код? Вопрос о 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. |
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();
|
Цитата:
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.constructor.prototype = new X;
alert( y instanceof Y );
alert( y instanceof X );
|
Цитата:
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: |
Цитата:
|
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
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/prototype#свойство-prototype думаю, тему можно закрывать. |
| Часовой пояс GMT +3, время: 20:23. |