2011-10-07 13 views
20

¿Cuál es el __proto__ de la función?

veo este diagrama agradable y he hecho algunas pruebas en mi navegador Chrome, pero no sé cómo explicar esto:

> Function.prototype 
    function Empty() {} 
> Function.__proto__ 
    function Empty() {} 
> typeof(Empty) 
    "undefined" 

¿Cuál es el function Empty() {}, y por qué Function.prototype no es un function un object igual Object.prototype?

Desde el diagrama anterior, parece que todo en JavaScript se inicia desde Object.prototype, estoy en lo cierto?

+0

La respuesta a este acertijo es esa Función .__ proto __.__ proto__ === Object.prototype. Pero no llegará allí a través del Function.constructor.prototype, porque se configuró en undefined (o no se configuró en absoluto). – Stefan

+0

+1 Siempre pienso que la forma más directa de explicar algo es dibujar una imagen/diagrama y dejarla hablar. Gracias por adjuntar el diagrama aquí! –

Respuesta

17

En primer lugar, la representación es function Empty() {}V8 cosas.

En V8, el objeto Function.prototype tiene "Empty "como el valor de la propiedad Function.prototype.name, así que supongo que probablemente está utilizando la consola de desarrollo de Chrome, y se muestra el nombre de la función de esta manera.

El name propiedad de los objetos de función es non-standard (no forma parte de ECMA-262), es por eso que vemos diferencias entre implementaciones.

Ahora, Function.prototype es una función, que devuelve siempre undefined y puede aceptar cualquier número de argumentos, pero ¿por qué? . Tal vez solo por coherencia, cada construcción incorporada El prototipo de Tor es así, Number.prototype es un objeto Number, Array.prototype es un objeto Array, RegExp.prototype es un objeto RegExp, y así sucesivamente ...

La única diferencia (por ejemplo, entre un objeto y la función Function.prototype) es que obviamente Function.prototype hereda de Object.prototype.

Parece que todo en javascript comienza desde Object.prototype, ¿estoy en lo cierto al respecto?

Bueno, tienes razón Object.prototype es el último objeto de la cadena de prototipo de la mayoría de los objetos, pero en ECMAScript 5, incluso se puede crear objetos que no se heredan de nada (al igual que Object.prototype es), y formar otra cadena de herencia, por ejemplo:

var parent = Object.create(null), 
    child = Object.create(parent); 

Object.prototype.isPrototypeOf(parent); // false 

Object.getPrototypeOf(parent);   // null 
Object.getPrototypeOf(Object.prototype); // null 
+0

En realidad, todavía tengo curiosidad por saber por qué las consolas generalmente muestran el tipo de Function.prototype como Function y todos los demás tipos RegExp, String, Number as Object. Sé que lo has mencionado pero por coherencia? Por favor, arroja algo más de luz sobre él – Gurjit

6

integrar CMS excelente respuesta:

parece que todo en javascript inicio de Object.prototype, estoy en lo cierto?

Absolutamente, los objetos en JavaScript están encadenados al Objeto básico. La cadena de herencia funciona en tiempo de ejecución, por lo que si se modifica un objeto base, todo lo que esté encadenado heredará las modificaciones de manera instantánea. Si un Objeto no tiene un método o una propiedad, la implementación de Javascript seguirá la cadena del prototipo hasta que la encuentre o fallará.

__proto__ es un descriptor de acceso estándar no al prototipo, que es apoyado a través de navegadores, pero no por el IE. De todos modos, no está destinado a ser utilizado por el código de la aplicación.

Cuestiones relacionadas