Показать сообщение отдельно
  #42 (permalink)  
Старый 26.02.2010, 18:53
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Kolyaj
Function является наследником Object
Сообщение от Kolyaj
[] instanceof Object
Фокус:

alert(Function instanceof Object === Object instanceof Function);


Так что, instanceof в JS может тоже с толку сбивать, хотя и имеет четкий однозначный алгоритм.

Объектный тип в ES - один - это тип Object (не путать с конструктором Object!).

Типы различных объектов (отличных от созданных new Object или {}) можно образно называть (в кавычках) - "подтипами". Но на самом деле - все они имеют тип Object.

И различие происходит только за счет внутренних свойств: [[Class]], [[Call]] и т.д.

Сообщение от tenshi
вот, специально для тебя нашёл определение типа array

http://hg.mozilla.org/tracemonkey/fi...rray.cpp#l1269
Сообщение от tenshi
а вот для типа object: http://hg.mozilla.org/tracemonkey/fi...jsobj.cpp#l120
А уровень реализации здесь мало имеет значения. Естественно, там удобней создать какую-то иерархическую структуру классов с отдельным описанием Array-я, Object-a и т.д. (для хранения своих методов, перегрузки определённых методов, как, например, у Array-я перегружен [[Put]] - запись свойства-индекса увеличивает .length).Но это не связано с уровнем абстракции ECMAScript-a, у которого есть только один объектный тип и называется он Object. А соответствующие конструкторы и их прототипы - это другое - и именно с этим связаны в реализациях классы Array, Object и любые другие.

А вот классифицируя "подтипами", например, на основании свойства [[Class]] (которое доступно для ES-абстракции) - да, можно разделять на подтип "Array" и "Object".
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 26.02.2010 в 18:57.
Ответить с цитированием