Yo pienso, yo demasiado metafórico y críptico con respuesta anterior. Sigue la aclaración.
Una instancia de Array, Boolean, Date, Function, Number, RegExp, String es un objeto pero mejorado con métodos y propiedades específicos de cada tipo. Por ejemplo, una matriz tiene una length
propiedad predefinida , mientras que los objetos genéricos no.
javascript:alert([].length+'\n'+{}.length)
muestra
0
indefinido
Intrínsecamente, el intérprete de FF Gecko también distingue entre Arrays y Objetos genéricos con distintas diferencias al evaluar las construcciones del lenguaje.
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);
exhibiendo
uno dos tres
[objeto Objeto]
["uno dos tres"]
4 .toSource () me olvidó!
3 y mi longitud!
({0: "uno", 1: "dos", 2: "tres", a: 4})
y 0 1 2 a
y 0 1 2 a
.
En cuanto a la afirmación de que todos los objetos son funciones:
No es ni sintácticamente ni semánticamente correcta de utilizar una instancia de objeto arbitrario como una función como 123()
o "abc"()
o []()
o {}()
o obj()
donde obj
es cualquier tipo distinto Function
, por lo que una instancia de objeto arbitrario no es una Function
. Sin embargo, dado un objeto obj
y su tipo como Array, Boolean, Date, ...
, ¿cómo obj
llegó a ser como un Array, Boolean, Date, ...
? ¿Qué es un Array, Boolean, Date, ...
?
javascript:
alert([Array, Boolean, Date, Function,
Number, Object, RegExp, String] . join('\n\n') );
muestra
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]
}
En todos los casos, sin equívocos, el tipo de objeto se manifiesta como una function
definición, de ahí la afirmación de que todos los objetos son funciones. (La ironía es que oscurecí y desdibujé intencionalmente la distinción de una instancia de objeto con la de su tipo. Aún así, esto muestra que "no se puede tener uno sin el otro", ¡Objeto y función! Las mayúsculas enfatizan el tipo como opuesto a la instancia.)
Tanto el paradigma funcional como el de objeto parecen ser fundamentales para la programación e implementación de las primitivas incorporadas de bajo nivel del intérprete JS, como Math
y JSON
y true
.
javascript:alert([Math, JSON, true.toSource()].join("\n\n"));
muestra
[object Math]
[object JSON]
(new Boolean(true))
En el momento del desarrollo de Javascript, estaba en boga un estilo de programación centrado en objetos (OOP, estilo de programación orientada a objetos, ¡el "es mi propio juego de palabras!) Y el intérprete fue bautizado de manera similar con Java para darle mayor credibilidad. . Las técnicas de programación funcional fueron relegadas a exámenes más abstractos y esotéricos que estudian las teorías de los Autómatas, Funciones Recursivas, Lenguajes Formales, etc. y como tales no son tan apetecibles. Sin embargo, las fortalezas de estas consideraciones formales se manifiestan claramente en Javascript, particularmente cuando se implementa en el motor Gecko de FF (es decir .toSource()
).
La definición de Objeto para Función es particularmente satisfactoria porque se define como una relación de recurrencia. definido usando su propia definición!
function Function() { [native code] }
y dado que una función es un Objeto, el mismo sentimiento es válido
function Object() { [native code] }
.
La mayoría de las otras definiciones se inactivan a un valor terminal estático. Sin embargo, eval()
es una primitiva particularmente poderosa, por lo que un String también puede incorporar una funcionalidad arbitraria.
Tenga en cuenta de nuevo, la lengua vernácula utilizada anteriormente oscurece el tipo de objeto y la distinción de instancia.