Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Про ecmaScript (https://javascript.ru/forum/misc/24023-pro-ecmascript.html)

Иваннн 15.12.2011 17:18

Про ecmaScript
 
Простите что заtraхал вопросами, но мне не поятно еще вот что:
п.13.2 создание объекта функции п.17 и 18.Не противоречит ли они утверждению что любая цепочка прототипов- конечна, а тут получается замкнутый круг. O._proto_==O?

trikadin 15.12.2011 17:35

"Ивааан! Ты что пишешь, окаянный?" (с)

А если по теме:
Цитата:

Сообщение от Иваннн
п.13.2 ... п.17 ... 18

УК РФ?

Nekromancer 15.12.2011 17:36

trikadin,
http://es5.github.com/
видимо он про это.

Хотя параграфа 17 и 18 в упор не вижу.

trikadin 15.12.2011 17:42

Цитата:

Сообщение от Nekromancer
Хотя параграфа 17 и 18 в упор не вижу.

О чём и речь, собственно. Что он там читает...

Иваннн 16.12.2011 12:02

Уточнения к теме
 
ECMAScript 5.1 параграф 13.2, перечень операций при создании объекта Function пункт 17 и18.

Nekromancer 16.12.2011 12:50

Pseudo code:
var F = new [[Function]], proto = new Object();
proto.defineProperty('constructor', {
value: F,
writable: true,
enumerable: false,
configurable: true
});
F.defineProperty('prototype', {
value: proto,
writable: true,
enumerable: false,
configurable: false
});

NOTE A prototype property is automatically created for every function, to allow for the possibility that the function will be used as a constructor.

Иваннн 16.12.2011 16:02

Nekromancer,
И чо!? :blink:
Псевдокод еще раз подтверждает мои слова и, соответсвенно вопрос (напомню "может ли быть так O_proto_=O"),а по поводу NOTE кто ж спорит.

Nekromancer 16.12.2011 16:11

Иваннн,
Омг, вам плохо видно? В коде то, о чём написано в примечании. И те 2 параграфа вам пишут об этом. Свойство __proto__ тут не причём, его в спецификации вообще нет. Это просто условное имя - proto, точно так же как для функции - F.
Означает, что создаётся обычный объект Object() в переменную proto, этот объект становится прототипов функции - пустой объект - пустой конструктор. И свойства конструктор этого объекта становится функцию.
Что сложного?

Livanderiaamarum 16.12.2011 16:35

ОТВЕЧАЮ ФАКТОМ - ДА, противоречит. Данная цепочка прототипов замкнута и не конечна.
просто обычно цепочки прототипов ведут к объекту Object.prototype, а тут вы сделали замкнутую цепочку которая не ведет к Object.prototype и это противоречит тому что вы прочитали. это можно вытворять искуственно меняя свойство обьектов __proto__ вытворяя с цепочкой что угодно, даже замыкая саму в себе. что бы вы где не читали, но большинство движков JS это позволяют.

просто по спецификации ЗАДУМАНО что это свойство __proto__ не должно быть доступно человеку)) но движки разрешают его изменять искусственно! Нормально ответил да)?

Nekromancer 16.12.2011 17:32

Livanderiaamarum,
Ёб**то ответил, да.

Livanderiaamarum 16.12.2011 17:40

Цитата:

Сообщение от Nekromancer (Сообщение 143493)
Livanderiaamarum,
Ёб**то ответил, да.

а почему)? по моему лучше чем многие тут, правдиво и понятно не)?
да и за словами следи, пока я те еблет не разбил морально)
тут люди нормально общаются, а ты грубишь.

Nekromancer 16.12.2011 17:44

>>> var a = {}; a.__proto__ = a;
TypeError: cyclic __proto__ value
[Прерывать на этой ошибке] a.__proto__ = a;

Действительно ведь, всё просто и логично :)

Livanderiaamarum 16.12.2011 17:47

Цитата:

Сообщение от Nekromancer (Сообщение 143502)
>>> var a = {}; a.__proto__ = a;
TypeError: cyclic __proto__ value
[Прерывать на этой ошибке] a.__proto__ = a;

Действительно ведь, всё просто и логично :)

я это знаю,
я говорю про то что написал ОН)

Не противоречит ли они утверждению что любая цепочка прототипов- конечна, а тут получается замкнутый круг. O._proto_==O?
да, тут цепочка замкнута) разве нет? ПРИ УСЛОВИИ ЧТО ЭТО ВЕРНО, а он именно такое условие задал)


и да я знаю что нельзя делать так, потому что при поиске в протатипных свойств интерпритатор пошлет нас мыл я нашел кольцевание)!

Nekromancer 16.12.2011 17:50

Livanderiaamarum,
Ну вы друг друга нашли, поздравляю :)

Livanderiaamarum 16.12.2011 17:53

Цитата:

Сообщение от Nekromancer (Сообщение 143507)
Livanderiaamarum,
Ну вы друг друга нашли, поздравляю :)

спасибо)

"это можно вытворять искуственно меняя свойство обьектов __proto__ вытворяя с цепочкой что угодно, даже замыкая саму в себе. что бы вы где не читали, но большинство движков JS это позволяют. "
- а еще я люблю портить википедию;)

НА САМОМ ДЕЛЕ, мы то знаем что интерпретатор ведет двунаправленный восходящий поиск))) в прототипах объектов и их конструкторах ^__^

Nekromancer 16.12.2011 18:00

Livanderiaamarum,
вы любите выносить людям мозг. Понятно, что знающие на вас не будут обращать внимания, а вот новички могут начать слушать. Вам нравится вводить людей в заблуждение что ле?

Livanderiaamarum 16.12.2011 18:02

Цитата:

Сообщение от Nekromancer (Сообщение 143510)
Livanderiaamarum,
вы любите выносить людям мозг. Понятно, что знающие на вас не будут обращать внимания, а вот новички могут начать слушать. Вам нравится вводить людей в заблуждение что ле?

Небольшой оффтопик)
Вот вы верующий? Хотел бы вас спросить кое о чем. я вот не силен в ритуалах, магии, призраках богах единорогах и прочих выдумках человека.

В частности не силен в религиях, хотел спросить, что библиия говорит про другие религии? Знает ли библия что она не одна религия? знает ли она что ритуалы , поклонения богу, если он существует, будут понятны лишь ЛЮДЯМ из за определенных культурных особенностей, например то что поклон означает - хорошо, имеет смысл только для человека, а для всемогущего существа неведомы культурные различия, так ведь)?

например магия бога не знает что такое свечки, так почему бы не использовать лампочки и.т.п.? богу то все ровно, главное то какой смысл в это вкладываешь ты.

то что по традиции нужно использовать для ритуалов свечки, это лишь из-за того что религия была придумана в эпоху когда не было лампочек и были свечки, а бог, он вне времени.
Может нам заменить свечки чем то более практичным, например лампочками?
так что на счет лампочек?
или богу угодны именно свечки?
я я думаю богу все ровно, это же только для людей имеет смысл, материальное.
так может все таки лампочки? ^__^
_______________________________________

я думаю намек понятен... как человек вопрос задал , так на него и ответят.

trikadin 16.12.2011 18:40

Цитата:

Сообщение от Livanderiaamarum
тут люди нормально общаются, а ты грубишь.

По-моему, не вам говорить другим о грубости. :D

Цитата:

Сообщение от Nekromancer
Понятно, что знающие на вас не будут обращать внимания, а вот новички могут начать слушать.

Тест на мозг) Его можно брать в отдел кадров: если соискатель его переспорит - значит, не дурак.

Цитата:

Сообщение от Livanderiaamarum
так может все таки лампочки? ^__^

Ты чего это на лампочках зациклился?) Изображаешь замкнутое наследование лампочка-свечка-лампочка?

Nekromancer 16.12.2011 18:45

trikadin,
по моему ему нечем заняться просто ) Вместо того, что бы курить доки, он выкуривает мозг людей )

trikadin 16.12.2011 18:49

Цитата:

Сообщение от Nekromancer
по моему ему нечем заняться просто

Это я уже заметил) И троллем не назовёшь нормальным, но мозг всё равно треплет.

Иваннн 19.12.2011 14:16

Продолжение беседы
 
Почему так получается:
function f(){
this.a=1
}
fo=new f();
alert(fo.constructor.prototype===fo.constructor.prototype.constructor.prototype) // true

И в то же время:
alert(fo.b) //undefined (хотя согласно  определению внутреннего метода [[GetProperty]] в ecmaScript5.1  поиск свойвства с именем b заканчивается только тогда, когда свойвство [[prototype]]   становится null , что смотря на первый пример не случится никогда.

Livanderiaamarum 19.12.2011 14:34

Цитата:

Сообщение от Иваннн (Сообщение 144447)
Почему так получается:
function f(){
this.a=1
}
fo=new f();
alert(fo.constructor.prototype===fo.constructor.prototype.constructor.prototype) // true

И в то же время:
alert(fo.b) //undefined (хотя согласно  определению внутреннего метода [[GetProperty]] в ecmaScript5.1  поиск свойвства с именем b заканчивается только тогда, когда свойвство [[prototype]]   становится null , что смотря на первый пример не случится никогда.

свойство [[prototype]] это не свойство prototype


их часто путают, свойство [[prototype]] в javascript имеет вид __proto__
именно это вы и путаете.

а свойство prototype же вообще означает СОВСЕМ ДРУГОЕ(не смотря на похожие названия) типа "тут хранить методы которые будут доступны ДЕТЯМ объекта."

почему эти методы не засунуть в самого родителя, а засовывать в его свойство prototype? спросите вы? ну я думаю что так сделали чтобы не засирать радителя методами детей и.т.п. и в нем создали типа папочку prototype , в которой ДЕТИ этого обьекта и будут искать свои методы)) как то так

______________________
И еще скажу, на заметку. В том что вы щас читаете ВНУТРЕННИЕ МЕТОДЫ (то есть недоступные программисту, пишутся с двойными квадратными скобками по бокам, то есть по задумке свойство [[prototype]] или по русски __proto__ НЕ ДОСТУПНЫ В КОДЕ, это внутренние методы языка это для создателей движков написано. Но создатели движков сжалились над нами и сделали свойство [[prototype]] ДОСТУПНЫМ нам в коде и назвали его __proto__, это НЕ по спецификации, но так больше возможностей , его даже можно вручную изменять и.т.п. ) , да , а название у него сменили потому что квадратные скобки интерпретатор не правильно поймет.

Nekromancer 19.12.2011 14:45

Иваннн,
Я вот не понимаю, чего вы хотите этим добиться, доказать что спецификация неправильная или что?
Не знаю даже как вам объяснить, конкретный пример в спецификации сейчас искать не хочется.
Я вот хотел вам сейчас рассказать как строится всё архитектура пространства в JavaScript, но вовремя увидел, что вы уж совсем намудрили.
fo.constructor.prototype===fo.constructor.prototyp e.constructor.prototype
Это тоже самое что
fo.constructor.prototype === fo.constructor.prototype
Естественно тут замкнутый круг, вы здесь ни разу не идёте по цепочке прототипов, а просто по кругу - от прототипа конструктора, к самому конструктору и опять по новой.
Правильная цепочка прототипов выглядит так:
alert((function(){}).prototype.__proto__ === Object.prototype) // true

alert(Object.prototype.__proto__)

В общем вы путаете свойство prototype у конструктора и свойства __proto__ у объекта, которое как раз и указывает на свойство prototype конструктора. В следствии чего __proto__.__proto__ будет указывать на родительский прототип. А __proto__.constructor.prototype указывает на само себя.

Иваннн 19.12.2011 14:46

Да вроде не путаю.
 
Как раз я обращаюсь к [[prototype]] созданного объекта, и к его [[prototype]] Т.к. fo.__proto__===fo.constructor.prototype можно так написать последнее выражение:
alert(fo.__proto__===fo.__proto__.__proto__) и будет True
А по поводу самого свойвства prototype - в спецификации 5.1 явно указано что там хранится ссылка на объект, выражаясь Вашими терминами, "родитель" (прототип) объекта fo.

Nekromancer 19.12.2011 14:48

var a = function(){},
fo = new a();
alert(fo.__proto__===fo.__proto__.__proto__) //false

Будьте внимательнее.

Иваннн 20.12.2011 12:41

Спасибо все понял.
 
У меня было два заблуждения:
1)что цепочка прототипов это не только __proto__.__proto__..и т.д., но и constructor.prototype. Обратное мне пытались сказать Некромансер и др., но я не догонял. Меня сбило с толку равенство объект.__proto__===объект.constructor. prototype ( True причем не всегда, смотри второе заблуждение). Оказывается что перейти на прототип выше (по прототипной цепочке) можно исключительно через неявное свойвство объекта [[prototype]] ( в некоторых браузерах- явная ссылка __proto__). Согласно спецификации при создании объекта функции(далее F) создается свойвство объекта функции prototype, которое ссылается на обект ( далее Р), свойвства которого будут унаследованы объектом, создаваемым указанной функцией F (допустим при использовании оператора new F()). Но в процессе создания нашей функции (F) у объекта Р создается свойвство (собственное) constructor.
Это свойвство как раз и ссылается на нашу функцию F. Получается замкнутый круг :P.constructor.prototype===P(-true при не изменении значения свойвства prototype ).
2) я упустил из виду, что свойвство constructor для объекта, построенного с помощю нашей функции F (пусть будет О) не родное свойвство, а наследуемое. А кто следующий в цепочке? O.__proto__- в нем то и содержится родное свойвство constructor.
После изменения свойвства конструктора F.prototype с дефаултного на любой другой объект (т.е. изменения прототипа создаваемого объекта О), при вызове O.constructor это свойвсто c именем constructor будет искатся в нем (в О), потом при отсутсвии в O.__proto__, знечение которого уже не старый прототип P, а новый подставленный объект.

Все это хорошо описано на данном сайте в разделе обучение (Lern((как-то так).javascript.ru) а я написал все это для того чтобы мне ответили правильно ли я всю эту кухню понял. Отдельное спасибо Некромансеру за терпение.


Часовой пояс GMT +3, время: 11:47.