Eu penso, sou muito metafórico e enigmático com a resposta anterior. O esclarecimento segue.
Uma instância de Array, Boolean, Date, Function, Number, RegExp, String é um objeto, mas aprimorado com métodos e propriedades específicos para cada tipo. Por exemplo, uma matriz tem uma length
propriedade predefinida , enquanto objetos genéricos não.
javascript:alert([].length+'\n'+{}.length)
monitores
0
Indefinido
Intrinsecamente, o interpretador FF Gecko também distingue entre Arrays e Objetos genéricos com diferenças distintas avaliando construções de linguagem.
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);
exibindo
um dois três
[objeto objeto]
["um dois três"]
4 .toSource () me esqueceu!
3 e meu comprimento!
({0: "um", 1: "dois", 2: "três", a: 4})
e 0 1 2 a
e 0 1 2 a
.
Em relação à declaração de que todos os objetos são funções:
Não é sintaticamente nem semanticamente correto usar uma instância de objeto arbitrário como uma função como 123()
ou "abc"()
ou []()
ou {}()
ou obj()
ondeobj
é qualquer tipo diferente de Function
, então um objeto arbitrário INSTÂNCIA não é a Function
. No entanto, dado um objeto obj
e seu tipo como Array, Boolean, Date, ...
, como obj
veio a ser como um Array, Boolean, Date, ...
? O que é um Array, Boolean, Date, ...
?
javascript:
alert([Array, Boolean, Date, Function,
Number, Object, RegExp, String] . join('\n\n') );
monitores
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]
}
Em todos os casos, sem equívocos, o tipo de objeto se manifesta como uma function
definição, daí a afirmação de que todos os objetos são funções! (A ironia é que eu intencionalmente obscureci e borrou a distinção de uma instância de objeto com a de seu tipo! Ainda assim, isso mostra "você não pode ter um sem o outro", Objeto e Função! A capitalização enfatiza o tipo como oposto a instância.)
Tanto um paradigma funcional quanto um de objeto parecem ser fundamentais para a programação e implementação dos primitivos integrados de baixo nível do interpretador JS, como Math
e JSON
e true
.
javascript:alert([Math, JSON, true.toSource()].join("\n\n"));
monitores
[object Math]
[object JSON]
(new Boolean(true))
Na época do desenvolvimento do Javascript, um estilo de programação centrado em objetos (OOP's - estilo de programação orientada a objetos - o "s" é meu próprio trocadilho!) Estava em voga e o interpretador foi batizado de forma semelhante com Java para dar-lhe maior credibilidade . Técnicas de programação funcional foram relegadas a exames mais abstratos e esotéricos estudando as teorias de autômatos, funções recursivas, linguagens formais, etc. e, como tal, não são palatáveis. No entanto, os pontos fortes dessas considerações formais são claramente manifestos em Javascript, particularmente conforme implementado no motor Gecko do FF (isto é .toSource()
).
A definição de objeto para Função é particularmente satisfatória porque é definida como uma relação de recorrência! definido usando sua própria definição!
function Function() { [native code] }
e uma vez que uma função é um objeto, o mesmo sentimento vale para
function Object() { [native code] }
.
A maioria das outras definições silencia para um valor terminal estático. Contudo,eval()
é um primitivo particularmente poderoso e, portanto, uma String também pode incorporar uma funcionalidade arbitrária.
Observe novamente, o vernáculo usado acima obscurece o tipo de objeto e distinção de instância.