Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 15.03.2009, 14:57
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

kefi,
Кто не наследуется? Конструктор? Или объект, созданный конструктором?

Только это тут не причем (и функция и объект, естественно, связаны цепочкой прототипов), мы говорим о том, что свойство prototype есть только у конструкторов (хотя в mozilla есть свойство __proto__ у объектов). Связь объект-прототип происходит в момент создания объекта. Т.е. когда вы вызываете new конструктор;.

Поскольку прототип это ссылка на объект, то вполне естественно, что все объекты, созданные конструктором, будут соединены с Object.prototype.

Последний раз редактировалось Андрей Параничев, 15.03.2009 в 15:16.
Ответить с цитированием
  #12 (permalink)  
Старый 15.03.2009, 15:30
Кандидат Javascript-наук
Отправить личное сообщение для kefi Посмотреть профиль Найти все сообщения от kefi
 
Регистрация: 12.03.2009
Сообщений: 148

Сообщение от Андрей Параничев
Кто не наследуется? Конструктор? Или объект, созданный конструктором?
Не то имел ввиду, имел ввиду Свойство prototype. Т.е. я хотел сказать что раз все объекты происходят от объекта Object, имеющее свойство prototype , то и они все должны иметь свойство prototype. Почему нет ?
Ответить с цитированием
  #13 (permalink)  
Старый 15.03.2009, 15:50
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 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.
Ответить с цитированием
  #14 (permalink)  
Старый 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 (permalink)  
Старый 15.03.2009, 16:11
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Андрей Параничев,
я опечатался. вернее не полностью напечатал фразу
уже исправил
Ответить с цитированием
  #16 (permalink)  
Старый 15.03.2009, 16:53
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Gvozd
есь внутренне своство(назовем его [[prototype]] к примеру)
почему "к примеру"? оно именно так и называется в спецификации, так что можно смело так и называть его при описаниях

kefi,

Ещё раз детальней постарайтесь прочитать материал по первой ссылке, которую Вам дал Zeroglif (там он достаточно хорошо и доступно объяснил). Если останутся вопросы (а они, конечно же, могут остаться, если Вы только начинаете изучать JS), то можно их уже будет локализовать и определить моменты, где именно остались неясности.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #17 (permalink)  
Старый 15.03.2009, 16:57
Кандидат Javascript-наук
Отправить личное сообщение для kefi Посмотреть профиль Найти все сообщения от kefi
 
Регистрация: 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.
Ответить с цитированием
  #18 (permalink)  
Старый 15.03.2009, 17:20
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 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__ - нет).
__________________
Тонкости ECMAScript
Ответить с цитированием
  #19 (permalink)  
Старый 15.03.2009, 17:31
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 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 малясь не успел,но дуаю будет полезно
Ответить с цитированием
  #20 (permalink)  
Старый 15.03.2009, 18:09
Кандидат Javascript-наук
Отправить личное сообщение для kefi Посмотреть профиль Найти все сообщения от kefi
 
Регистрация: 12.03.2009
Сообщений: 148

2 Gvozd> Ну да, я Вас понял буквально и неверно , - что прототип объекта - это объект.prototype,
Т.е. ВСЕГДА нужно понимать так, что прототип объекта - это прототип его конструктора, т.е. объект.constructor.prototype,

Последний раз редактировалось kefi, 15.03.2009 в 18:25.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с javascript andruhin Общие вопросы Javascript 12 04.05.2012 10:05
Программист на JavaScript (удалённо) Vadym Работа 1 28.01.2009 13:57
Приглашаем специалиста по JavaScript. Мск, от 75 000 руб. arturus Работа 30 14.01.2009 02:30
JavaScript Developer, Санкт-Петербург (2000 - 2500 $) lampa Работа 3 26.08.2008 15:41
Нужен Старший разработчик JavaScript Yandex Работа 17 19.08.2008 16:43