kefi,
Кто не наследуется? Конструктор? Или объект, созданный конструктором? Только это тут не причем (и функция и объект, естественно, связаны цепочкой прототипов), мы говорим о том, что свойство prototype есть только у конструкторов (хотя в mozilla есть свойство __proto__ у объектов). Связь объект-прототип происходит в момент создания объекта. Т.е. когда вы вызываете new конструктор;. Поскольку прототип это ссылка на объект, то вполне естественно, что все объекты, созданные конструктором, будут соединены с Object.prototype. |
Цитата:
|
есть объекты.
а есть функции-конструкторы. вот у функций-конструкторов(которые являются сами объектами, типа Function) есть свойство ptototype.оно есть только у функций, и влияет на создаваемые этими функциями-конструкторами объекты у обычных же объектов нету свойтва prototype есь внутренне своство(назовем его [[prototype]] к примеру), котороее ссылается на свойство prototype функции-конструктора, чоздавшей этот объект.если у объекта нету какого-то свойства, то оно ищется в объекте [[prototype]]. свойство [[prototype]] нигде не доступнов явном виде, и работать с ним напрямую невозможно(исключение:в мозилле оно доступно под именем __proto__), поэтому его имя для нас не так важно. таким образом свойство prototype(не путать с [[prototype]])есть только у функций-конструкторов(любая функция может быть функцией-конструкотором, если внетри нее используются конструкция this) Object - это функция конструктор тоже.она создает объект типа Object Любая функция должна иметь prototype ссылающийся на объект по умолчанию это экземпляр типа Object но, можно заменить на любой другой свой объект.именно на объект,а не на функцию-конструктор. свойство prototype функции-конструктора указывает какой объект должен быть в свойстве [[prototype]] создаваемого объекта.именно это [[prototype]] и называется прототипом объекта. таким образом у всех объектов создаваемых одной функцией-конструктором прототип будет общий. в свою очередь у этого прототипа есть свой прототип.в вершине этого дерева находится объект типа Object вот так вот сумбурно попытался объяснить суть дела если не прав, кто-нибудь исправьте PS еще раз:свойство prototype функции-конструктора не является прототипом функции.но оно указывает какой объект будет прототипом создаваемых объектов |
Цитата:
var a = function() {} a.prototype.hi = 1; alert(a.__proto__ == a.prototype); // false Цитата:
Вообще, в спецификации есть довольно неплохие определения конструктора и прототипа: Цитата:
Цитата:
|
Андрей Параничев,
я опечатался. вернее не полностью напечатал фразу уже исправил |
Цитата:
kefi, Ещё раз детальней постарайтесь прочитать материал по первой ссылке, которую Вам дал Zeroglif (там он достаточно хорошо и доступно объяснил). Если останутся вопросы (а они, конечно же, могут остаться, если Вы только начинаете изучать JS), то можно их уже будет локализовать и определить моменты, где именно остались неясности. |
Цитата:
var constr = function(){ this.a = 1;} //var constr = new Function("this.a = 1;") // <- или так //alert([constr.__proto__ == constr.prototype,constr.__proto__ == constr.constructor.prototype]); // false , true alert([constr.prototype == constr.constructor.prototype, constr.prototype, constr.constructor.prototype]); // false,[object Object], function prototype() { [native code] } Т.е. прототипом вновь создаваемых объектов подобных constr , будет constr.constructor.prototype==function prototype() { [native code] } , а прототипом функции function(){ this.a = 1;} будет constr.prototype== [object Object] . ? |
Цитата:
alert(constr.__proto__); // оригинальный Function.prototype, который равен function () {} alert(constr.constructor.prototype); // то же самое, т.к. конструктор у constr - Function alert(constr.constructor.prototype === constr.__proto__); Однако, т.к. constr сам конструктор, то все порождённые от него объекты также будут иметь свой __proto__: var a = new constr(); alert(a.__proto__); // объект, на который так же указывает constr.prototype (пока эта ссылка есть) alert(a.__proto__ === constr.prototype); // действительно, они указывают на один объект Поэтому родной прототип конструктора constr - это constr.__proto__, а прототип порождаемых от constr объектов - constr.prototype (порождённые объекты от constr будут смотреть на constr.prototype через .__proto__. Причём, ссылка constr.prototype может исчезнуть позже, а порождённыйОбъект.__proto__ - нет). |
прототипом вновь создаваемых объектов типа constr,т.е. создаваемых при помощи
obj=new constr() будет obj.__proto__==constr.prototype==obj.constructor.prototype то есть объект [object Object] прототипом же функции constr , создаваемой var constr = function(){ this.a = 1;}//так var constr = new Function("this.a = 1;") // <- или так будет constr.__proto__==Function.prototype==constr.constructor.prototype то есть function(){} PS малясь не успел,но дуаю будет полезно |
2 Gvozd> Ну да, я Вас понял буквально и неверно , - что прототип объекта - это объект.prototype,
Т.е. ВСЕГДА нужно понимать так, что прототип объекта - это прототип его конструктора, т.е. объект.constructor.prototype, |
Часовой пояс GMT +3, время: 08:48. |