Мне кажется, я слишком метафоричен и загадочен с предыдущим ответом. Уточнение следует.
Экземпляр Array, Boolean, Date, Function, Number, RegExp, String является объектом, но с добавлением методов и свойств, специфичных для каждого типа. Например, массив имеет предопределенное свойство length
, а универсальные объекты - нет.
javascript:alert([].length+'\n'+{}.length)
отображает
0
undefined
По сути, интерпретатор FF Gecko также различает массивы и общие объекты с четкими различиями в оценке языковых конструкций.
javascript:
ra=[ "one", "two", "three"]; ra.a=4;
ob={0:"one", 1:"two", 2:"three"}; ob.a=4;
alert(
ra +"\n\n"+
ob +"\n\n"+
ra.toSource() +"\n\n"+
ra.a +"\t .toSource() forgot me! \n\n"+
ra.length +"\t and my length! \n\n"+
ob.toSource());
ps=""; for(i in ra)ps+=i+" "; alert(ps); /* NB .length is missing! */
ps=""; for(i in ob)ps+=i+" "; alert(ps);
отображение
one,two,three
[object Object]
["one", "two", "three"]
4 .toSource() forgot me!
3 and my length!
({0:"one", 1:"two", 2:"three", a:4})
и 0 1 2 a
и 0 1 2 a
.
Что касается утверждения, что все объекты являются функциями:
Ни синтаксически, ни семантически не корректно использовать произвольный экземпляр объекта в качестве функции типа 123()
, "abc"()
, []()
, {}()
или obj()
, где obj
- это любой тип, отличный от Function
, поэтому произвольный объект INSTANCE не является Function
. Однако, учитывая объект obj
и его тип Array, Boolean, Date, ...
, как obj
стал Array, Boolean, Date, ...
? Что такое Array, Boolean, Date, ...
?
javascript:
alert([Array, Boolean, Date, Function,
Number, Object, RegExp, String] . join('\n\n') );
отображает
function Array() {
[native code]
}
function Boolean() {
[native code]
}
function Date() {
[native code]
}
function Function() {
[native code]
}
function Number() {
[native code]
}
function Object() {
[native code]
}
function RegExp() {
[native code]
}
function String() {
[native code]
}
В каждом случае, без двусмысленности, тип объекта проявляется как function
определение, отсюда и утверждение, что все объекты являются функциями! (Ирония в том, что я намеренно затушевал и размыл различие между экземпляром объекта и его типом! Тем не менее, это показывает, что «у вас не может быть одного без другого», объекта и функции! Использование заглавных букв подчеркивает тип как в отличие от экземпляра.)
И функциональная, и объектная парадигмы кажутся фундаментальными для программирования и реализации встроенных примитивов низкого уровня интерпретатора JS, таких как Math
, JSON
и true
.
javascript:alert([Math, JSON, true.toSource()].join("\n\n"));
отображает
[object Math]
[object JSON]
(new Boolean(true))
Во время разработки Javascript в моде был объектно-ориентированный стиль программирования (ООП - стиль объектно-ориентированного программирования - «s» - это мой собственный каламбур!), И интерпретатор был также назван Java, чтобы придать ему большее доверие. . Методы функционального программирования были отнесены к более абстрактным и эзотерическим экзаменам, изучающим теории автоматов, рекурсивных функций, формальных языков и т. Д., И как таковые не были приемлемыми. Однако сильные стороны этих формальных соображений явно проявляются в Javascript, особенно в том виде, в котором они реализованы в движке FF Gecko (т. Е. .toSource()
).
Определение объекта для функции особенно удовлетворительно, так как оно определено как рекуррентное отношение! определяется с использованием собственного определения!
function Function() { [native code] }
и поскольку функция является объектом, то же самое относится и к
function Object() { [native code] }
.
Большинство других определений подчиняются статическому конечному значению. Однако eval()
является особенно мощным примитивом, поэтому String также может включать произвольные функции.
Еще раз обратите внимание, что используемый выше жаргон скрывает различие между типом объекта и экземпляром.
person
Ekim
schedule
17.05.2011