![]() |
|
||||||||||
|
|
|
|||||
|
Я постил этот вопрос не в одном месте сегодня, посему Вы не обидитесь если я тупо скопирую мессадж сюда, хотя он и на англицком. Тем более, что упоминаемая в нём дока тоже на англицком, и вообще Вы можете мне чего-то объяснить, только если Вы понимаете эти англицкие доки.
Итак, скрипт: <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() ? |
|
|||||
|
Регистрация: Dec 2001
Сообщений: 4,159
|
realMakc, ты что-то спросить хотел -- или так, покурить вышел?
__________________
GIT d++ s++:++ a C++$ UB++ P++ L+ E+ W+++ N++ w++ O+ M V- t-- 5-- X+ R+++ tv- b+++ D++ |
|
|||||
|
Ну так я и спрашиваю: объясните, вернее даже разжуйте мне, пожалуйста, поподробнее, какого такого во втором случае alert выводит Object() ?
|
|
|||||
|
Регистрация: Dec 2001
Сообщений: 4,159
|
Потому, что через поле prototype передается информация о типе объекта. Когда ты эту информацию уничтожил Javascript'у ничего не осталось кроме как считать, что ты работаешь с базовым прототипом: Object.
__________________
GIT d++ s++:++ a C++$ UB++ P++ L+ E+ W+++ N++ w++ O+ M V- t-- 5-- X+ R+++ tv- b+++ D++ |
|
|||||
|
Цитата:
Джаваскрипт - не человек. Он не принимает первое попавшееся решение только потому, что ему "ничего не остаётся". Он действует на основании жёстко запрограммированных правил, зная которые, можно прогнозировать, что он будет делать в подобных ситуациях. Конкретно, меня интересует, какой МЕХАНИЗМ появления свойства "конструктор", определённого как "Объект()", во втором случае. |
|
|||||
|
Регистрация: Dec 2001
Сообщений: 4,159
|
Цитата:
Брат, ты открыл мне глаза на суровую реальность. Цитата:
Если тебя интересует не МЕХАНИЗМ, а причины его именно такой реализации, то все просто: через атрибут prototype доступен "образец" объекта. И заменив его на другой ты фактически в том числе заменяешь конструктор: Если присвоить undefined, то получаешь объект вообще без образца. Единственным объектом такого вида является Object.
__________________
GIT d++ s++:++ a C++$ UB++ P++ L+ E+ W+++ N++ w++ O+ M V- t-- 5-- X+ R+++ tv- b+++ D++ |
|
|||||
|
твой скрипт всего лишь показывает, что свойство ".constructor" находится в "prototype".
это и так ясно. не ясно (было), где оно находится, когда "prototype" нету. Вот кто открыл мне глаза, так это один умный мужик в microsoft.public.scripting.jscript, который рассказал таки, где находится и как выглядит МЕХВАНИЗМ. Это не код интерпретатора, а стандарт ECMA, который описывает процедуры создания объектов весьма подробно, в 10-ках пунктов, с объяснением необходимых манипуляций над внутренними, по-видимому не доступными через скрипт свойствами создаваемых объектов. Да, на фоне этого дока Мелкомягких из МаСтДайЕН-а -- школьный букварь. Ну, фсё, пошёл блин читать, а то заснуть не могу... |
|
|||||
|
Регистрация: Dec 2001
Сообщений: 4,159
|
Если мсье имеет в виду главу 4.2.1 спецификации ECMAscript, то это как раз то, что я тебе на пальцах показал.
![]() Вот только нюанс: JS в IE не является строгой реализацией ECMSscript, а потому читать ЭТУ спецификацию для поиска механизма по меньшей мере странно. Если тебя интересовал механизм ECMAscript'а, то нужно было именно об этом и спрашивать.
__________________
GIT d++ s++:++ a C++$ UB++ P++ L+ E+ W+++ N++ w++ O+ M V- t-- 5-- X+ R+++ tv- b+++ D++ |
|
|||||
|
мосье имеет ввиду разделы 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
на пальцах... на пальцах и я могу. а вот объяснить... |
|
|||||
|
Регистрация: Dec 2001
Сообщений: 4,159
|
Цитата:
Столь же бессмысленно говорить о частичной совместимости со стандартом, если не иметь в руках полного списка отклонений. У тебя есть основания считать, что именно разделы "13.2.2, 11.2.2 и, может быть, 15.2.х" выполнены в JScript'е на 100%?
__________________
GIT d++ s++:++ a C++$ UB++ P++ L+ E+ W+++ N++ w++ O+ M V- t-- 5-- X+ R+++ tv- b+++ D++ |
![]() |
Часовой пояс GMT +4, время: 01:04. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|