javascript prototype

¿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:

  1. Todos los tipos no primitivos son objetos en JavaScript.
  2. Todos los objetos se heredan directa o indirectamente de Object.prototype (a menos que el prototipo se cambie explícitamente mediante setPrototypeOf).
  3. 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.
  4. 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).
  5. 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, establece this 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.

  6. Como la función se trata como un objeto en JavaScript, podemos agregarle propiedades y crear nuevos objetos a partir de ella.
  7. 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 un new 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.

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