javascript - para - que es un prototype
¿Qué es el__proto__ de Function? (2)
Para integrar CMS excelente respuesta:
Parece que todo en javascript comienza desde Object.prototype, ¿tengo razón al respecto?
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 se le encadene heredará las modificaciones al instante. Si un Objeto no tiene un método o una propiedad, la implementación de Javascript seguirá la cadena del prototipo hasta que lo encuentre o fallará.
__proto__
es un acceso estándar al prototipo, que se admite en todos los navegadores, pero no en IE. De todos modos no está destinado a ser utilizado por el código de la aplicación.
Veo este bonito diagrama y he realizado algunas pruebas en mi navegador Chrome, pero no sé cómo explicar esto:
> Function.prototype
function Empty() {}
> Function.__proto__
function Empty() {}
> typeof(Empty)
"undefined"
¿Qué es la function Empty() {}
y por qué Function.prototype
es una function
no un object
como Object.prototype
?
En el diagrama de arriba, parece que todo en JavaScript comienza desde Object.prototype
, ¿tengo razón al respecto?
Primero, la representación de la function Empty() {}
es V8 .
En V8, el objeto Function.prototype
tiene el valor "Empty
" como valor de la propiedad Function.prototype.name
, por lo que supongo que probablemente esté utilizando la Consola de desarrollador de Chrome y muestre el nombre de la función de esta manera.
La propiedad de name
de los objetos de función non-standard
es non-standard
(no es parte de ECMA-262), por eso vemos diferencias entre implementaciones.
Ahora, Function.prototype
es una función que siempre devuelve undefined
y puede aceptar cualquier número de argumentos, ¿pero por qué? Tal vez solo por coherencia, todo prototipo de constructor integrado 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 cualquier objeto de función y Function.prototype
) es que, obviamente, Function.prototype
hereda de Object.prototype
.
Parece que todo en javascript comienza desde Object.prototype, ¿tengo razón al respecto?
Bueno, tienes razón. Object.prototype
es el último objeto de la cadena de prototipos de la mayoría de los objetos, pero en ECMAScript 5, incluso puedes crear objetos que no se heredan de nada (como Object.prototype
es Object.prototype
) y formar otro. 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