Мені здається, я занадто метафоричний і виразний з попередньою відповіддю. Пояснення випливає.
Екземпляр Array, Boolean, Date, Function, Number, RegExp, String - це об'єкт, але розширений методами та властивостями, характерними для кожного типу. Наприклад, масив має заздалегідь задане length
властивість, тоді як загальні об'єкти цього не роблять.
javascript:alert([].length+'\n'+{}.length)
дисплеї
0
невизначений
Внутрішньо, інтерпретатор Ф. Ф. Гекко також розрізняє масиви та загальні об'єкти з чіткими відмінностями, що оцінюють мовні конструкції.
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);
показ
один два три
[об’єкт об’єкта]
["один два три"]
4 .toSource () забув мене!
3 і моя довжина!
({0: "один", 1: "два", 2: "три", 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, об'єктно-орієнтований стиль програмування (OOP - Об'єктно-орієнтований стиль програмування - "s" - це мій власний каламбур!) Був у моді, і інтерпретатор був аналогічно охрещений Java, щоб надати йому більшу надійність. . Методи функціонального програмування були перенесені на більш абстрактні та езотеричні дослідження, що вивчають теорії автоматів, рекурсивні функції, формальні мови тощо. Однак сильні сторони цих формальних міркувань чітко проявляються в Javascript, особливо як це реалізовано в двигуні Gecko FF (тобто .toSource()
).
Визначення об'єкта для функції особливо задовольняє, оскільки воно визначається як відношення рецидиву! визначено за допомогою власного визначення!
function Function() { [native code] }
а оскільки функція є Об'єктом, то і для цих самих настроїв
function Object() { [native code] }
.
Більшість інших визначень примикає до статичного кінцевого значення. Однак,eval()
є особливо потужним примітивом, тому String також може вбудовувати довільну функціональність.
Зауважимо ще раз, просторіччя, яке використовується вище, затьмарює різницю типу об’єкта та екземпляра.