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