Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   DHTML/JS/CSS (http://www.flasher.ru/forum/forumdisplay.php?f=24)
-   -   Загадка джейскриптовского ООП-а (http://www.flasher.ru/forum/showthread.php?t=51376)

realMakc 12.11.2003 22:57

Загадка джейскриптовского ООП-а
 
Я постил этот вопрос не в одном месте сегодня, посему Вы не обидитесь если я тупо скопирую мессадж сюда, хотя он и на англицком. Тем более, что упоминаемая в нём дока тоже на англицком, и вообще Вы можете мне чего-то объяснить, только если Вы понимаете эти англицкие доки.

Итак, скрипт:
<SCRiPT>

function A()
{
alert( this.constructor )
}

a1 = new A() // displays A(), no prob.

A.prototype = undefined
a2 = new A() // displays Object(), why?

</SCRiPT>


According to JScript specification (http://msdn.microsoft.com/library/de...onstructor.asp),

"The constructor property contains a reference to the function that constructs instances of that particular object."

Here, A() definetly constructs a2, since we see its message during object construction, but the message itself is saying that constructor is Object(), not A(). According to mentioned specification,

"The constructor property is a member of the prototype of every object that has a prototype."

This is a tricky place. At the beginning, A() still has a prototype, therefore the "constructor" property of A() prototype (which should be - and actually is - A() ) gets displayed, when object a1 is created.

Later, we remove prototype (containing "constructor" property) from A(), therefore it could be expected that alert(this.constructor) after should display "undefined" or something.

However, latter doesn't happen: "constructor" does not have to be a property of A()'s prototype anymore exactly because A() doesn't have a prototype.

JScript specification gives one no clue, which object "constructor" is own property of, when "the function that constructs instances" (here, A()) does not have a prototype.

Hence the question: where is it coming from, and why it equals to Object() ?

Crazy 13.11.2003 01:43

realMakc, ты что-то спросить хотел -- или так, покурить вышел?

realMakc 13.11.2003 09:53

Ну так я и спрашиваю: объясните, вернее даже разжуйте мне, пожалуйста, поподробнее, какого такого во втором случае alert выводит Object() ?

Crazy 13.11.2003 13:08

Потому, что через поле prototype передается информация о типе объекта. Когда ты эту информацию уничтожил Javascript'у ничего не осталось кроме как считать, что ты работаешь с базовым прототипом: Object.

realMakc 13.11.2003 23:51

Цитата:

Javascript'у ничего не осталось кроме как считать, что ты работаешь с базовым прототипом: Object.
C равным успехом он мог посчитать, что я работаю например с Function().

Джаваскрипт - не человек. Он не принимает первое попавшееся решение только потому, что ему "ничего не остаётся". Он действует на основании жёстко запрограммированных правил, зная которые, можно прогнозировать, что он будет делать в подобных ситуациях.

Конкретно, меня интересует, какой МЕХАНИЗМ появления свойства "конструктор", определённого как "Объект()", во втором случае.

Crazy 14.11.2003 01:08

Цитата:

Оригинал написал(а) realMakc
Джаваскрипт - не человек. Он не принимает первое попавшееся решение только потому, что ему "ничего не остаётся". Он действует на основании жёстко запрограммированных правил, зная которые, можно прогнозировать, что он будет делать в подобных ситуациях.
Блин! А я до сих пор был уверен, что внутри браузера живет маленькие человечек, который скрипты исполняет. Шустрый такой.

Брат, ты открыл мне глаза на суровую реальность.

Цитата:

Конкретно, меня интересует, какой МЕХАНИЗМ появления свойства "конструктор", определённого как "Объект()", во втором случае.
Сейчас я тоже открою тебе глаза на суровую реальность: так запрограммировали те, кто сделал интерпретатор JS. Ты, собственно, чего хочешь -- чтобы тебе исходники интерпрератора показали?

Если тебя интересует не МЕХАНИЗМ, а причины его именно такой реализации, то все просто: через атрибут prototype доступен "образец" объекта. И заменив его на другой ты фактически в том числе заменяешь конструктор:

Код:

<script>
function foo() {
  alert(this.constructor);
}
function bar() {
  alert('!!!');
}
new foo();
foo.prototype=bar.prototype;
new foo();
</script>

Если присвоить undefined, то получаешь объект вообще без образца. Единственным объектом такого вида является Object.

realMakc 14.11.2003 20:50

твой скрипт всего лишь показывает, что свойство ".constructor" находится в "prototype".

это и так ясно. не ясно (было), где оно находится, когда "prototype" нету.

Вот кто открыл мне глаза, так это один умный мужик в microsoft.public.scripting.jscript, который рассказал таки, где находится и как выглядит МЕХВАНИЗМ.

Это не код интерпретатора, а стандарт ECMA, который описывает процедуры создания объектов весьма подробно, в 10-ках пунктов, с объяснением необходимых манипуляций над внутренними, по-видимому не доступными через скрипт свойствами создаваемых объектов.

Да, на фоне этого дока Мелкомягких из МаСтДайЕН-а -- школьный букварь. Ну, фсё, пошёл блин читать, а то заснуть не могу...

Crazy 14.11.2003 21:16

Если мсье имеет в виду главу 4.2.1 спецификации ECMAscript, то это как раз то, что я тебе на пальцах показал. :D

Вот только нюанс: JS в IE не является строгой реализацией ECMSscript, а потому читать ЭТУ спецификацию для поиска механизма по меньшей мере странно.

Если тебя интересовал механизм ECMAscript'а, то нужно было именно об этом и спрашивать.

realMakc 16.11.2003 22:52

мосье имеет ввиду разделы 13.2.2, 11.2.2 и, может быть, 15.2.х, а также пользуется тем обстоятельством, что "With only a few minor exceptions ... JScript is a full implementation of the ECMA standard." -- http://msdn.microsoft.com/library/de...jsconabout.asp

на пальцах... на пальцах и я могу. а вот объяснить...

Crazy 17.11.2003 14:52

Цитата:

Оригинал написал(а) realMakc
"With only a few minor exceptions ... JScript is a full implementation of the ECMA standard."[/b]
Ты бывает осетрины второй свежести. Если осетрина второй свежести, то это значит, что она тухлая.

Столь же бессмысленно говорить о частичной совместимости со стандартом, если не иметь в руках полного списка отклонений.

У тебя есть основания считать, что именно разделы "13.2.2, 11.2.2 и, может быть, 15.2.х" выполнены в JScript'е на 100%?

realMakc 24.11.2003 22:02

Цитата:

Оригинал написал(а) Crazy
...иметь в руках полного списка отклонений.
In just two clicks away from URL I posted, you can find a thing you ask about: http://msdn.microsoft.com/library/de...nformation.asp

Crazy 25.11.2003 03:40

Ответ неверный. Там есть список объектов совместимых со стандартом. И есть список объектов, не совместимых с ним. Но я не вижу по этой ссылке утверждения о том, что свято выполняется пункты 15.2.x стандарта, а равно не вижу утверждений, на основании которых можно сделать такой выворд. Если это там есть и я просто упустил, то просто процитируй, please.

realMakc 27.11.2003 22:58

c твоих позиций, относительно любого движка ЕСМА, не доступного в исходниках, например, движка Флеш-плейера, не может быть доказано, что он соответствует стандарту.

Тем не менее, если а) утверждается, что "JScript's Object is ECMA feature" и б) секция 15.2 ЕСМЫ (Object Objects) объясняет наблюдаемое поведение объектов Object в JScript-е, то я не вижу оснований отказываться признать, что "что свято выполняется пункты 15.2.x стандарта"

Я не понял примера с тухлой рыбой (там слов не хватает, что ли), посему приведу тебе такой: когда твоя девушка говорит тебе, что она тебя любит, ты не можешь залезть ей в мозг и убедиться, так ли это, однако, если её реальные действия не опровергают этого, у тебя нет причин высказывать ей сомнения, не так ли ?

Crazy 01.12.2003 14:21

Цитата:

Оригинал написал(а) realMakc
c твоих позиций, относительно любого движка ЕСМА, не доступного в исходниках, например, движка Флеш-плейера, не может быть доказано, что он соответствует стандарту.
Дружище, не надо так откровенно передергивать. Ибо, если взять твой же пример:

Цитата:

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

realMakc 02.12.2003 10:30

Присутствие дополнительных фич относительно ЕСМЫ (ActiveXObject или _root - пофиг) не отменяет ЕСМовость остальных.

Crazy 02.12.2003 16:26

Ты невнимательно читал "List of non-ECMA features currently in JScript". Там идет речь не только о том, что отсутсвует в ECMAscript и добавлено в JS, но и о том, что присутствует в ECMAscript и изменено в JS.

С другой стороны -- если ты так хочешь вопреки здравому смыслу верить в строгое соблюдение в JS стандарта ECMAscript даже вопреки данным microsoft, то я не вижу ни малейшей потребности тебя разубеждать.

Так что -- адиос. :)


Часовой пояс GMT +4, время: 01:00.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.