|
|
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
Всем привет. Наткнулся на такой пример, который мне пока не до конца понятен: Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Вроде понятно, что у всех объектов есть некий базовый прототип, как в примере Foo.prototype, у которого можно добавлять поля и функции. Тоесть новые функции хранятся в объекте-прототипе. с new Foo() - мне понятно. Но мне не понятно, где хранится функция Foo.method? И на каком этапе этот объект создается? Правильно ли я рассуждаю, если скажу что - Foo - это некий статический объект, который может хранить любые ключ-значения, в частности стандартное поле prototype? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 19:00 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
и еще вопрос вдогонку - что значит из комментария - "Создаём несвязанную версию "method""? Не связанную с чем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 19:02 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
unicornmirageПравильно ли я рассуждаю, если скажу что - Foo - это некий статический объект, который может хранить любые ключ-значения, в частности стандартное поле prototype?да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 19:03 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
unicornmirageНе связанную с чем?не связанную с объектом, который будет создан как new Foo() . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 19:05 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
Яростный МечunicornmirageПравильно ли я рассуждаю, если скажу что - Foo - это некий статический объект, который может хранить любые ключ-значения, в частности стандартное поле prototype?да. В таком случае: Foo.method и Foo.prototype.method это совершенно разные методы, просто называются одинаково. И разница в том, что Foo.method - доступен для статического объекта Foo . А Foo.prototype.method - доступен только из экземпляра new Foo() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 19:14 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 19:17 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
спасибо за ответы. Еще возникло два вопроса по поводу примера в первом посте: когда мы создаем новый экземпляр через new Foo(), то в нем создаются копии всех полей из prototype. 1) так как в примере новый экземпляр через new Foo() не был создан , то строка: Function.call.apply(Foo.prototype.method, arguments); фактически вызывает статическую функцию прототипа Foo.prototype? 2) зачем при создании экземпляра через new - копировать функции? С полями данных - логично, так как они определяют состояние нового объекта. А вот функции зачем копировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 21:37 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
авторзачем при создании экземпляра через new - копировать функции?Никто их не копирует prototype это указатель на другой эоемент ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 21:46 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
Малыхин Сергейавторзачем при создании экземпляра через new - копировать функции?Никто их не копирует prototype это указатель на другой эоемент Тогда как объяснить такой результат: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 21:54 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
Малыхин Сергейавторзачем при создании экземпляра через new - копировать функции?Никто их не копирует prototype это указатель на другой эоемент Тогда как объяснить такой результат: Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. На экран выведет: авторNOID one two ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 21:55 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
Элементов id может быть сколько угодно в цепочке прототипов сначало id ищется у текущего элемента если не найдено то ищется у предка через указатель prototype В первом случае явно у предка запрашивается id в последующих id берется у текущего элемента new вызывает конструктор (если это можно назвать конструктором) который создает id в новом элементе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:05 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
А что смущает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:14 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
Edd.DragonА что смущает? хочу понять, при создании нового экземпляра через new, какая логическая организация полей-объектов и полей-функций в памяти, относительно нового созданного объекта. Малыхин Сергей Элементов id может быть сколько угодно в цепочке прототипов сначало id ищется у текущего элемента если не найдено то ищется у предка через указатель prototype new вызывает конструктор (если это можно назвать конструктором) который создает id в новом элементе Тоесть в данном случае id - это уже совсем другой id, не связанный никак с полем Foo.prototype.id? Тоесть получается, если мы в конструкторе Foo не будем задавать this.id = ..., то у экземпляра new Foo() поле id будет ссылаться на Foo.prototype.id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:25 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
Конструкция "new Foo('x')" создаст/вернет новый элемент т.е. Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:36 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
unicornmirage, у функции Foo есть свойство prototype. Foo.prototype - некий объект, со своими полями. new Foo() создает новый объект, которому можно присваивать некие свои поля (this.id = id; это и делает). однако в объекте, созданном через new Foo(), есть скрытое поле-ссылка (назовем ее "__proto__"), которая ссылается на тот же объект, на который ссылается Foo.prototype (на момент вызова new Foo()) Код: javascript 1. так вот obj.__proto__ ссылается на этот прототипный объект. когда ты вызываешь obj.myFunc(), метод myFunc сначала ищется непосредственно в составе объекта obj. если не находится, ищется в составе obj.__proto__ у прототипа так же может быть свой прототип, и если в obj.__proto__ не нашлось, будет искаться в obj.__proto__.__proto__ и т.д. по цепочке прототипов. Поразмыслив над этим, ты поймешь, почему конструкция Код: javascript 1. 2. 3. "добавляет" метод myFunc2 во все объекты, уже созданные как new Foo(), или создаваемые в дальнейшем как new Foo(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:51 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
авторТоесть получается, если мы в конструкторе Foo не будем задавать this.id = ..., то у экземпляра new Foo() поле id будет ссылаться на Foo.prototype.id Что мешает попробовать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:51 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
unicornmirageТоесть получается, если мы в конструкторе Foo не будем задавать this.id = ..., то у экземпляра new Foo() поле id будет ссылаться на Foo.prototype.idда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:52 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
теперь разобрался в этом вопросе. всем большое спасибо за помощь! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 23:06 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
Яростный МечunicornmirageТоесть получается, если мы в конструкторе Foo не будем задавать this.id = ..., то у экземпляра new Foo() поле id будет ссылаться на Foo.prototype.idда. Похоже оно будет иметь такое же значение как Foo.prototype.id, но вот ссылаться на него оно не будет, иначе это привело бы к тому, что изменение id в одном экземпляре отражалось бы в других экземплярах Foo. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2013, 18:08 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
LexxxxxЯростный Мечпропущено... да. Похоже оно будет иметь такое же значение как Foo.prototype.id, но вот ссылаться на него оно не будет, иначе это привело бы к тому, что изменение id в одном экземпляре отражалось бы в других экземплярах Foo.Чё? Книжек перечитали? 1. Свойство ищется у объекта; 2. Если нет, то ищется у объекта, на который ссылается __proto__; 3. Если нет, то п. 2 повторяется для объекта из п. 2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2013, 18:23 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
skyANA1. Свойство ищется у объекта; 2. Если нет, то ищется у объекта, на который ссылается __proto__;... Предположим есть два экземпляра объекта, item1 и item2, у которых в их прототипе есть свойство protoProperty, со значением 18. Мы пишем код типа item1.protoProperty = 5; skyANA1. Свойство ищется у объекта; 2. Если нет, то ищется у объекта, на который ссылается __proto__;... и находится "у объекта, на который ссылается __proto__" и присваивается ему 5. Правильно?! Далее мы пишем var e = item 2 .protoProperty; skyANA1. Свойство ищется у объекта; 2. Если нет, то ищется у объекта, на который ссылается __proto__;... и находится "у объекта, на который ссылается __proto__" и чему будет равно var e? Если следовать Вашей логике то 5. Я правильно понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2013, 18:43 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
LexxxxxskyANA1. Свойство ищется у объекта; 2. Если нет, то ищется у объекта, на который ссылается __proto__;... Предположим есть два экземпляра объекта, item1 и item2, у которых в их прототипе есть свойство protoProperty, со значением 18. Мы пишем код типа item1.protoProperty = 5; После этого свойство protoProperty появится у объекта item1 LexxxxxskyANA1. Свойство ищется у объекта; 2. Если нет, то ищется у объекта, на который ссылается __proto__;... и находится "у объекта, на который ссылается __proto__" и присваивается ему 5. Правильно?! Далее мы пишем var e = item 2 .protoProperty; skyANA1. Свойство ищется у объекта; 2. Если нет, то ищется у объекта, на который ссылается __proto__;... и находится "у объекта, на который ссылается __proto__" и чему будет равно var e? Если следовать Вашей логике то 5. Я правильно понял?Речь шла о "если мы в конструкторе Foo не будем задавать this.id". Так понятнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2013, 18:52 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
skyANA...После этого свойство protoProperty появится у объекта item1 ... Т.е. в момент первой записи значения item1.protoProperty = 5 где-то внутри него будет выделена память для хранения значения (5) и все последующие операции чтения/записи будут производится с этой памятью вплоть до того момента (если он вообще наступит), когда будет выполнен код delete item1.protoProperty, после чего item1.protoProperty будет опять ссылаться на Object.prototype.protoProperty. Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2013, 19:07 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2013, 19:40 |
|
||
|
Поясните по поводу одной вещи в Javascript
|
|||
|---|---|---|---|
|
#18+
skyANALexxxxx, если нет свойства, то оно не может куда-то ссылаться 13635132 Код: javascript 1. 2. 3. 4. Разве е не будет = 18, хотя свойства item1.protoProperty еще нет (согласно Вашим словам оно появится только тогда, когда в него запишут чего нибудь)? Значит вместо item1.protoProperty произошло обращение куда-то еще (Object.prototype.protoProperty)? skyANAЕщё раз перечитайте отсюда: 13635132 У меня возникает ощущение, что мы об одном и том же разговариваем, только немного разными словами. Так в какой момент времени во вселенной появится свойство item1.protoProperty? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2013, 19:52 |
|
||
|
|

start [/forum/topic.php?fid=22&msg=38080189&tid=1448892]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
173ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
79ms |
get tp. blocked users: |
2ms |
| others: | 250ms |
| total: | 550ms |

| 0 / 0 |
