15.03.2009, 14:57
|
|
|
Регистрация: 21.02.2008
Сообщений: 1,250
|
|
kefi,
Кто не наследуется? Конструктор? Или объект, созданный конструктором?
Только это тут не причем (и функция и объект, естественно, связаны цепочкой прототипов), мы говорим о том, что свойство prototype есть только у конструкторов (хотя в mozilla есть свойство __proto__ у объектов). Связь объект-прототип происходит в момент создания объекта. Т.е. когда вы вызываете new конструктор;.
Поскольку прототип это ссылка на объект, то вполне естественно, что все объекты, созданные конструктором, будут соединены с Object.prototype.
Последний раз редактировалось Андрей Параничев, 15.03.2009 в 15:16.
|
|
15.03.2009, 15:30
|
Кандидат Javascript-наук
|
|
Регистрация: 12.03.2009
Сообщений: 148
|
|
Сообщение от Андрей Параничев
|
Кто не наследуется? Конструктор? Или объект, созданный конструктором?
|
Не то имел ввиду, имел ввиду Свойство prototype. Т.е. я хотел сказать что раз все объекты происходят от объекта Object, имеющее свойство prototype , то и они все должны иметь свойство prototype. Почему нет ?
|
|
15.03.2009, 15:50
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
есть объекты.
а есть функции-конструкторы.
вот у функций-конструкторов(которые являются сами объектами, типа Function) есть свойство ptototype.оно есть только у функций, и влияет на создаваемые этими функциями-конструкторами объекты
у обычных же объектов нету свойтва prototype
есь внутренне своство(назовем его [[prototype]] к примеру), котороее ссылается на свойство prototype функции-конструктора, чоздавшей этот объект.если у объекта нету какого-то свойства, то оно ищется в объекте [[prototype]]. свойство [[prototype]] нигде не доступнов явном виде, и работать с ним напрямую невозможно(исключение:в мозилле оно доступно под именем __proto__), поэтому его имя для нас не так важно.
таким образом свойство prototype(не путать с [[prototype]])есть только у функций-конструкторов(любая функция может быть функцией-конструкотором, если внетри нее используются конструкция this)
Object - это функция конструктор тоже.она создает объект типа Object
Любая функция должна иметь prototype ссылающийся на объект
по умолчанию это экземпляр типа Object
но, можно заменить на любой другой свой объект.именно на объект,а не на функцию-конструктор.
свойство prototype функции-конструктора указывает какой объект должен быть в свойстве [[prototype]] создаваемого объекта.именно это [[prototype]] и называется прототипом объекта.
таким образом у всех объектов создаваемых одной функцией-конструктором прототип будет общий.
в свою очередь у этого прототипа есть свой прототип.в вершине этого дерева находится объект типа Object
вот так вот сумбурно попытался объяснить суть дела
если не прав, кто-нибудь исправьте
PS еще раз:свойство prototype функции-конструктора не является прототипом функции.но оно указывает какой объект будет прототипом создаваемых объектов
Последний раз редактировалось Gvozd, 15.03.2009 в 16:10.
|
|
15.03.2009, 15:56
|
|
|
Регистрация: 21.02.2008
Сообщений: 1,250
|
|
Сообщение от Gvozd
|
свойство prototype функции-конструктора прототипом функции
|
Это не так:
var a = function() {}
a.prototype.hi = 1;
alert(a.__proto__ == a.prototype); // false
Сообщение от Gvozd
|
любая функция может быть функцией-конструкотором, если внетри нее используются конструкция this
|
Она может быть конструктором, даже если в ней не используется this.
Вообще, в спецификации есть довольно неплохие определения конструктора и прототипа:
Цитата:
|
Конструктор - объект типа Function, который создаёт и инициализирует объекты. Каждый конструктор обладает соответствующим объектом-прототипом, который используется для реализации наследования и разделяемых свойств.
|
Цитата:
|
Прототип - объект, используемый для реализации наследования структуры, состояния и поведения в ECMAScript. Когда конструктор создаёт объект, этот объект неявно ссылается на соответствующий этому конструктору прототип, чтобы использовать его для разрешения ссылок на свойства. Связанный с конструктором прототип доступен через выражение constructor.prototype, а свойства, добавляемые к прототипу объекта разделяются, посредством наследования, всеми объектами, разделяющими прототип.
|
Последний раз редактировалось Андрей Параничев, 15.03.2009 в 16:00.
|
|
15.03.2009, 16:11
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Андрей Параничев,
я опечатался. вернее не полностью напечатал фразу
уже исправил
|
|
15.03.2009, 16:53
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Сообщение от Gvozd
|
есь внутренне своство(назовем его [[prototype]] к примеру)
|
почему "к примеру"? оно именно так и называется в спецификации, так что можно смело так и называть его при описаниях
kefi,
Ещё раз детальней постарайтесь прочитать материал по первой ссылке, которую Вам дал Zeroglif (там он достаточно хорошо и доступно объяснил). Если останутся вопросы (а они, конечно же, могут остаться, если Вы только начинаете изучать JS), то можно их уже будет локализовать и определить моменты, где именно остались неясности.
|
|
15.03.2009, 16:57
|
Кандидат Javascript-наук
|
|
Регистрация: 12.03.2009
Сообщений: 148
|
|
Сообщение от Gvozd
|
свойство prototype функции-конструктора не является прототипом функции.но оно указывает какой объект будет прототипом создаваемых объектов
|
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] .
?
Последний раз редактировалось kefi, 15.03.2009 в 17:08.
|
|
15.03.2009, 17:20
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Сообщение от kefi
|
Т.е. прототипом вновь создаваемых объектов подобных constr , будет function prototype() { [native code] } ,
а прототипом функции function(){ this.a = 1;} будет [object Object] .
|
constr - у Вас конструктор. Естественно, он тоже объект, и у него есть свой прототип - __proto__:
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__ - нет).
|
|
15.03.2009, 17:31
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
прототипом вновь создаваемых объектов типа 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 малясь не успел,но дуаю будет полезно
|
|
15.03.2009, 18:09
|
Кандидат Javascript-наук
|
|
Регистрация: 12.03.2009
Сообщений: 148
|
|
2 Gvozd> Ну да, я Вас понял буквально и неверно , - что прототип объекта - это объект.prototype,
Т.е. ВСЕГДА нужно понимать так, что прототип объекта - это прототип его конструктора, т.е. объект.constructor.prototype,
Последний раз редактировалось kefi, 15.03.2009 в 18:25.
|
|
|
|