![]() |
Загадка джейскриптовского ООП-а
Я постил этот вопрос не в одном месте сегодня, посему Вы не обидитесь если я тупо скопирую мессадж сюда, хотя он и на англицком. Тем более, что упоминаемая в нём дока тоже на англицком, и вообще Вы можете мне чего-то объяснить, только если Вы понимаете эти англицкие доки.
Итак, скрипт: <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() ? |
realMakc, ты что-то спросить хотел -- или так, покурить вышел?
|
Ну так я и спрашиваю: объясните, вернее даже разжуйте мне, пожалуйста, поподробнее, какого такого во втором случае alert выводит Object() ?
|
Потому, что через поле prototype передается информация о типе объекта. Когда ты эту информацию уничтожил Javascript'у ничего не осталось кроме как считать, что ты работаешь с базовым прототипом: Object.
|
Цитата:
Джаваскрипт - не человек. Он не принимает первое попавшееся решение только потому, что ему "ничего не остаётся". Он действует на основании жёстко запрограммированных правил, зная которые, можно прогнозировать, что он будет делать в подобных ситуациях. Конкретно, меня интересует, какой МЕХАНИЗМ появления свойства "конструктор", определённого как "Объект()", во втором случае. |
Цитата:
Брат, ты открыл мне глаза на суровую реальность. Цитата:
Если тебя интересует не МЕХАНИЗМ, а причины его именно такой реализации, то все просто: через атрибут prototype доступен "образец" объекта. И заменив его на другой ты фактически в том числе заменяешь конструктор: Код:
<script> |
твой скрипт всего лишь показывает, что свойство ".constructor" находится в "prototype".
это и так ясно. не ясно (было), где оно находится, когда "prototype" нету. Вот кто открыл мне глаза, так это один умный мужик в microsoft.public.scripting.jscript, который рассказал таки, где находится и как выглядит МЕХВАНИЗМ. Это не код интерпретатора, а стандарт ECMA, который описывает процедуры создания объектов весьма подробно, в 10-ках пунктов, с объяснением необходимых манипуляций над внутренними, по-видимому не доступными через скрипт свойствами создаваемых объектов. Да, на фоне этого дока Мелкомягких из МаСтДайЕН-а -- школьный букварь. Ну, фсё, пошёл блин читать, а то заснуть не могу... |
Если мсье имеет в виду главу 4.2.1 спецификации ECMAscript, то это как раз то, что я тебе на пальцах показал. :D
Вот только нюанс: JS в IE не является строгой реализацией ECMSscript, а потому читать ЭТУ спецификацию для поиска механизма по меньшей мере странно. Если тебя интересовал механизм ECMAscript'а, то нужно было именно об этом и спрашивать. |
мосье имеет ввиду разделы 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
на пальцах... на пальцах и я могу. а вот объяснить... |
Цитата:
Столь же бессмысленно говорить о частичной совместимости со стандартом, если не иметь в руках полного списка отклонений. У тебя есть основания считать, что именно разделы "13.2.2, 11.2.2 и, может быть, 15.2.х" выполнены в JScript'е на 100%? |
Цитата:
|
Ответ неверный. Там есть список объектов совместимых со стандартом. И есть список объектов, не совместимых с ним. Но я не вижу по этой ссылке утверждения о том, что свято выполняется пункты 15.2.x стандарта, а равно не вижу утверждений, на основании которых можно сделать такой выворд. Если это там есть и я просто упустил, то просто процитируй, please.
|
c твоих позиций, относительно любого движка ЕСМА, не доступного в исходниках, например, движка Флеш-плейера, не может быть доказано, что он соответствует стандарту.
Тем не менее, если а) утверждается, что "JScript's Object is ECMA feature" и б) секция 15.2 ЕСМЫ (Object Objects) объясняет наблюдаемое поведение объектов Object в JScript-е, то я не вижу оснований отказываться признать, что "что свято выполняется пункты 15.2.x стандарта" Я не понял примера с тухлой рыбой (там слов не хватает, что ли), посему приведу тебе такой: когда твоя девушка говорит тебе, что она тебя любит, ты не можешь залезть ей в мозг и убедиться, так ли это, однако, если её реальные действия не опровергают этого, у тебя нет причин высказывать ей сомнения, не так ли ? |
Цитата:
Цитата:
|
Присутствие дополнительных фич относительно ЕСМЫ (ActiveXObject или _root - пофиг) не отменяет ЕСМовость остальных.
|
Ты невнимательно читал "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
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.