Форум 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%?


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

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