¿Es `Object` una función en JavaScript?
prototype (7)
Considera esta función:
function Foo(){
var a = "3";
};
Según __proto__ VS. prototipo en JavaScript ,
Foo.__proto__ = Function.prototype
Function.prototype.__proto__ = Object.prototype
Entendí esa parte, pero si hago esto en la consola de Google Chrome:
Object.__proto__
output: ƒ () { /* native code */ }
Function.__proto__
output: ƒ () { /* native code */ }
P1:
¿Por qué están apuntando a la función?
¿Qué son en realidad
Function
y
Object
y en qué se diferencian entre sí, porque
Objeto es en realidad una función
?
typeof Object
"function"
P2:
Si todo es un objeto en JavaScript, ¿por qué es un
Object
una función?
Además, ¿cómo se implementa una función dentro de JavaScript?
¿Qué sucede con las variables declaradas dentro de una función?
¿Es una función convertida en un objeto por el compilador de JavaScript?
Lo siento si me falta algo obvio. Estoy realmente confundido por la forma en que la función y el objeto se implementan en JavaScript.
Función y Objeto son ambas funciones constructoras que se pueden usar para crear una función y un objeto, respectivamente, que es la razón por la cual la
typeof Function
devuelve
function
.
Acerca de cómo las funciones y los objetos están relacionados en javascript, considere los siguientes puntos:
- Todos los tipos no primitivos son objetos en JavaScript.
- Todos los objetos se heredan directa o indirectamente de Object.prototype (a menos que el prototipo se cambie explícitamente mediante setPrototypeOf).
- Todas las funciones nativas heredan de Function.prototype que hereda de Object.prototype, por lo que significa que la función se hereda indirectamente de Object.prototype porque las funciones se tratan como objetos en JavaScript.
- La razón por la que las funciones se tratan como objetos se debe a que se pueden pasar como parámetros a otras funciones y se pueden devolver desde funciones, es decir, funciones de orden superior (una característica poderosa de javascript).
-
Se puede llamar a una función usando el operador
()
porque el motor de JavaScript sabe que se declara usando una palabra clave de función y tiene un código ejecutable. Por lo tanto, cada vez que se llama, el motor de JavaScript crea un nuevo contexto de ejecución, establecethis
enlace y luego ejecuta la función. Nada de eso sucede cuando intenta llamar a un objeto; en cambio, se genera un error, es decir, "no es una función".Entonces podemos decir que no todos los objetos son una función porque pueden no haber sido declarados usando la palabra clave de la función y no tener código ejecutable.
- Como la función se trata como un objeto en JavaScript, podemos agregarle propiedades y crear nuevos objetos a partir de ella.
-
No se puede llamar a un objeto de tipo no funcional usando
()
porque no tiene código ejecutable y no se declara usando la palabra clave de función. En su lugar, se declara utilizando unnew Object()
o notación de objeto y contiene métodos y propiedades.
Espero que se aclare ambas preguntas.
Fundamentalmente
Functions
tiene algún código que puede ser ejecutado.
Object
son aquellos que contienen datos.
Para la clase
Point
tiene
x
y
y
.
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
isOrigin() { return x == 0 && y == 0; }
}
let p = new Point();
respuesta 1
En esto,
p
es un
object
que contiene datos u otras funciones.
p.isOrigin
es función.
De manera similar, la clase
Point
es en sí misma una
function
que cuando se
ejecuta
produce
p
.
Es por eso que todas las clases como
Object
y
Functions
son
functions
constructor functions
más precisamente.
Respuesta 2
Si todo es un objeto en JavaScript, ¿por qué es un
Object
una función?
Igual que la Respuesta 1.
Además, ¿cómo se implementa una función dentro de JavaScript?
Diferentes motores de JavaScript tendrán diferentes implementaciones. Tienen especificaciones que deben seguir.
¿Qué sucede con las variables declaradas dentro de una función?
Fuera de contexto.
Cada
function
ejecuta con un alcance que contiene todos los datos para esas funciones.
¿Es una función convertida en un objeto por el compilador de JavaScript?
No estoy seguro de qué estás preguntando.
La referencia de ECMAScript es muy buena para responder a estas preguntas.
- https://www.ecma-international.org/ecma-262/9.0/index.html#sec-ecmascript-language-types es el punto de entrada sobre qué tipos admite el idioma, e introduce el concepto de que todo lo que hay es ya sea un valor bastante estándar (booleano, cadena, etc.), o un objeto. Pero no hay más tipos.
- https://www.ecma-international.org/ecma-262/9.0/index.html#sec-object-type explica el tipo de objeto. En el fondo, es una colección de atributos y / o accesores (think getter / setter). Esto también introduce el término "objeto de función".
- https://www.ecma-international.org/ecma-262/9.0/index.html#sec-object-internal-methods-and-internal-slots muestra la semántica interna, los métodos internos, etc. de los objetos. Al final de esa sección, específicamente, se describen las funciones internas específicas del "objeto de función" ("Llamada" y "Construcción"), incluidos pequeños detalles, como que el constructor es opcional.
Por lo tanto, para responder a su pregunta:
Foo
puede ser más que un objeto (porque todo lo demás en el menú es un tipo de valor básico).
Por lo tanto,
Foo()
es una sintaxis especial que simplemente invoca el método de
Call
interno de ese objeto.
Pero
Foo
sí mismo es un objeto completo, puedes hacer con él todo lo que puedes hacer con cualquier otro objeto, incluida la configuración de atributos arbitrarios.
Tener un método definido en un objeto simplemente significa que hay un atributo con ese nombre, y el atributo hace referencia a un objeto, que resulta ser un "objeto de función".
Algo que se puede usar como constructor es, de nuevo, simplemente un objeto que tiene un método interno de
Construct
, y el azúcar sintáctico para llamarlo.
Como usted sabe, no hay clases en JavaScript, es un lenguaje orientado a objetos basado en prototipos (es lo más orientado a
objetos
que puede obtener, literalmente no tiene nada más).
Entonces, cualquier tipo de "prototipo" es solo un enlace entre objetos.
Un método constructor (como se explica en el enlace dado anteriormente) simplemente llama al método constructor con el objeto sobre el que fue llamado (es decir, algo como
String
) como un argumento, al igual que el lenguaje llamaría
Call
siendo
this
el objeto el método ha sido invocado en.
Parece que estás confundido entre "objeto" (la estructura de datos) y
Object
(la función).
Un objeto es un concepto en JavaScript que es un contenedor genérico para algunos datos. Un objeto contiene propiedades con claves y valores asociados.
En JavaScript, todo lo que no es
primitive
es un objeto.
Esto incluye funciones, que son básicamente un tipo especial de objeto que se puede "llamar" con la sintaxis
()
.
JavaScript proporciona una serie de funciones incorporadas que tienen varios propósitos.
Dos de estas funciones pasan a llamarse
Object
y
Function
.
En otras palabras, el
Object
es una función y, por lo tanto, también un "objeto" (estructura de datos).
Tomemos su función
Foo
como ejemplo:
function Foo() {
var a = "3";
}
Foo
es una función.
Esto significa que
Foo
puede ser llamado, por ejemplo.
var f = Foo()
.
En este caso
f
será
undefined
ya que
Foo
no devuelve nada.
Como
Foo
es una función, también es un objeto.
Esto significa que también podemos agregar y leer propiedades de él:
Foo.bar = 5;
Foo.bar++;
console.log(Foo.bar); // prints 6
Tenga en cuenta que esta parte de "objeto" de
Foo
no está relacionada con el contenido de la función.
Eso significa que el código que declaró (
var a = "3"
) es irrelevante.
No puede acceder a
var a
de ninguna manera aquí porque no existe hasta que llame a la función.
Si fueras a hacer
Foo.a
, no estás manipulando
var a
dentro de la función;
está trabajando con la propiedad
a
en el objeto
Foo
.
Sin embargo, puede hacerlo al revés y acceder a las propiedades en
Foo
dentro de la función:
function Foo() {
var a = "3"; // a is local to this scope, you cannot get to it from outside
console.log(a); // prints 3 - local variable a is accessible inside the scope of this function
console.log(Foo.a); // prints 5 - a is a property on object Foo, and is accessible here
}
// var a inside Foo cannot be accessed here
Foo.a = 5;
Foo();
Edición: Re.
Tu pregunta sobre "esto" en los comentarios.
this
es una palabra clave especial en JavaScript que se refiere a un objeto.
Sin embargo, este objeto
no
es la función en sí, es un nuevo objeto que se crea cuando llama a una función con la
new
palabra clave:
function Bar() {
this.a = 10;
console.log(this == Bar); // prints false
}
var bar = new Bar();
console.log(bar.a); // prints 10
Una función que debe llamarse con la
new
palabra clave se denomina "función constructora".
Object
y
Function
son ejemplos de funciones de constructor, por lo que sus nombres comienzan con una letra mayúscula (una convención en JavaScript).
Cuando creas un objeto con una función constructora, la propiedad
prototype
de esta función se usa como prototipo (accesible a través de
__proto__
) del objeto creado.
console.log(bar.constructor == Bar) // prints true
console.log(bar.__proto__ == Bar.prototype) // prints true
this
también se usa para otras cosas, pero ese es un tema amplio y está fuera del alcance de esta pregunta.
Sí, el
objeto
es de tipo función.
Es una implementación de clase / función que cuando se invoca con new (
new Object()
) resultará en un objeto con memoria asignada.
Object
es la
función constructora
de todos los objetos.
Por lo tanto, tipo de
typeof Object==="function"
Aquí hay un fragmento para la visualización:
console.log(typeof Object) //function (which is an object)
var object=new Object() //An instance of Object ''class''
console.log(typeof object) //object
console.log(object instanceof Object) //true, because object is created by Object()
Function
es la
función constructora
de todas las funciones (incluida ella misma ...)
Entonces, aunque no todo es una función , pero la mayoría de los identificadores nativos en mayúsculas se refieren a una función constructora.
P1: ¿Por qué están apuntando a la función?
A1: Porque son funciones.
Function
y
Object
son solo funciones constructoras.
La función es un
Function object
.
objeto es un
Object object
.
P2: Si todo es un objeto en JavaScript, ¿por qué es un
Object
una función?
A2: Porque el
Object
es solo una función constructora.
typeof Object
// ''function''
typeof new Object()
// ''object''
Y una función es una instancia de
Function
, por lo que hace que una función sea un objeto.
(function(){}) instanceof Function
// true