Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Архив Flasher.ru > Работа над сайтом > DHTML/JS/CSS

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 12.11.2003, 22:57
realMakc вне форума Посмотреть профиль Отправить личное сообщение для realMakc Найти все сообщения от realMakc
  № 1  
realMakc
 
Аватар для realMakc

Регистрация: Oct 2002
Сообщений: 284
Отправить сообщение для realMakc с помощью ICQ
По умолчанию Загадка джейскриптовского ООП-а

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

Итак, скрипт:
<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() ?

Старый 13.11.2003, 01:43
Crazy вне форума Посмотреть профиль Отправить личное сообщение для Crazy Посетить домашнюю страницу Crazy Найти все сообщения от Crazy
  № 2  
Crazy
[+1 23.05.11]
 
Аватар для Crazy

Регистрация: 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++

Старый 13.11.2003, 09:53
realMakc вне форума Посмотреть профиль Отправить личное сообщение для realMakc Найти все сообщения от realMakc
  № 3  
realMakc
 
Аватар для realMakc

Регистрация: Oct 2002
Сообщений: 284
Отправить сообщение для realMakc с помощью ICQ
Ну так я и спрашиваю: объясните, вернее даже разжуйте мне, пожалуйста, поподробнее, какого такого во втором случае alert выводит Object() ?

Старый 13.11.2003, 13:08
Crazy вне форума Посмотреть профиль Отправить личное сообщение для Crazy Посетить домашнюю страницу Crazy Найти все сообщения от Crazy
  № 4  
Crazy
[+1 23.05.11]
 
Аватар для Crazy

Регистрация: 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++

Старый 13.11.2003, 23:51
realMakc вне форума Посмотреть профиль Отправить личное сообщение для realMakc Найти все сообщения от realMakc
  № 5  
realMakc
 
Аватар для realMakc

Регистрация: Oct 2002
Сообщений: 284
Отправить сообщение для realMakc с помощью ICQ
Цитата:
Javascript'у ничего не осталось кроме как считать, что ты работаешь с базовым прототипом: Object.
C равным успехом он мог посчитать, что я работаю например с Function().

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

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

Старый 14.11.2003, 01:08
Crazy вне форума Посмотреть профиль Отправить личное сообщение для Crazy Посетить домашнюю страницу Crazy Найти все сообщения от Crazy
  № 6  
Crazy
[+1 23.05.11]
 
Аватар для Crazy

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

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

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

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

Код:
<script>
function foo() {
  alert(this.constructor);
}
function bar() {
  alert('!!!');
}
new foo();
foo.prototype=bar.prototype;
new foo();
</script>
Если присвоить undefined, то получаешь объект вообще без образца. Единственным объектом такого вида является Object.
__________________
GIT d++ s++:++ a C++$ UB++ P++ L+ E+ W+++ N++ w++ O+ M V- t-- 5-- X+ R+++ tv- b+++ D++

Старый 14.11.2003, 20:50
realMakc вне форума Посмотреть профиль Отправить личное сообщение для realMakc Найти все сообщения от realMakc
  № 7  
realMakc
 
Аватар для realMakc

Регистрация: Oct 2002
Сообщений: 284
Отправить сообщение для realMakc с помощью ICQ
твой скрипт всего лишь показывает, что свойство ".constructor" находится в "prototype".

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

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

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

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

Старый 14.11.2003, 21:16
Crazy вне форума Посмотреть профиль Отправить личное сообщение для Crazy Посетить домашнюю страницу Crazy Найти все сообщения от Crazy
  № 8  
Crazy
[+1 23.05.11]
 
Аватар для Crazy

Регистрация: 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++

Старый 16.11.2003, 22:52
realMakc вне форума Посмотреть профиль Отправить личное сообщение для realMakc Найти все сообщения от realMakc
  № 9  
realMakc
 
Аватар для realMakc

Регистрация: Oct 2002
Сообщений: 284
Отправить сообщение для realMakc с помощью ICQ
мосье имеет ввиду разделы 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

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

Старый 17.11.2003, 14:52
Crazy вне форума Посмотреть профиль Отправить личное сообщение для Crazy Посетить домашнюю страницу Crazy Найти все сообщения от Crazy
  № 10  
Crazy
[+1 23.05.11]
 
Аватар для Crazy

Регистрация: Dec 2001
Сообщений: 4,159
Цитата:
Оригинал написал(а) 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%?
__________________
GIT d++ s++:++ a C++$ UB++ P++ L+ E+ W+++ N++ w++ O+ M V- t-- 5-- X+ R+++ tv- b+++ D++

Создать новую тему   Часовой пояс GMT +4, время: 23:28.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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