Почему не работает код? Вопрос о 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 думаю, тему можно закрывать. |
nerv_, а где список всех задач посмотреть?
|
FINoM, я знаю только этот способ - здесь нажать показать/спрятать задачи.
|
Собсно, вопрос, исходя из темы: какими способами можно модифицировать прототип свойствами другого объекта (или его прототипа) во время или после инициализации экземпляра конструктора?
В разделе "ваши сайты и скрипты" я предложил два метода: использовать __proto__ и тупо соединить старый прототип с новым объектом, просто копируя новые свойства. |
После долгого и нудного гугления, определил, что никак. Когда-нибудь в браузерах появится Object.setProrotypeOf, но сейчас этот метод только обсуждается.
|
вот нашел у себя в хламе давно как то экспериментировал:
function setProto( object, proto ) {
if ( "__proto__" in Object.prototype ) {
return object.__proto__ = proto, object;
}
var protoFn = function() {},
hasDefine = false;
try {
Object.defineProperty({}, 'test', {value:null});
hasDefine = true;
} catch( _e_ ) {}
protoFn.prototype = proto;
proto = new protoFn();
for( var key in object ) {
if ( object.hasOwnProperty( key ) ) {
if ( hasDefine ) {
Object.defineProperty( proto, key, Object.getOwnPropertyDescriptor( object, key ) );
} else {
proto[ key ] = object[ key ];
}
}
}
return proto;
}
var a = {
get name() {
return "Hello";
},
testA: function() {}
}
var b = {
get name() {
return Object.getPrototypeOf( this ).name + " world";
},
testB: "str",
he: undefined
}
var c = {
name: function() {
return Object.getPrototypeOf( this ).name + " world test";
}
}
b = setProto( b, a )
c = setProto( c, b );
alert( c.name() );
|
devote, да, я тоже такое решение нашел. Но нужно не вернуть объект с новым прототипом, а привязать к уже готовому.
|
А вот зачем мне это: http://javascript.ru/forum/project/3...edovaniya.html (если ты тему раньше не заметил).
|
Цитата:
|
Цитата:
|
Цитата:
|
| Часовой пояс GMT +3, время: 15:03. |