Estoy aprendiendo el prototipo de You Don't Know JS: this & Object Prototypes , que es un libro maravilloso para comprender el diseño debajo y aclarar tantas ideas falsas (es por eso que estoy tratando de evitar el uso de la herencia y cosas por el estilo instanceof
).
Pero tengo la misma pregunta que la gente hizo aquí. Varias respuestas son realmente útiles y esclarecedoras. También me encantaría compartir mis entendimientos.
¿Qué es un prototipo?
Los objetos en JavaScript tienen una propiedad interna, indicada en la especificación como [[Prototype]]
, que es simplemente una referencia a otro objeto. Casi todos los objetos reciben un nonull
valor para esta propiedad, en el momento de su creación.
¿Cómo obtener el prototipo de un objeto?
a través de __proto__
oObject.getPrototypeOf
var a = { name: "wendi" };
a.__proto__ === Object.prototype // true
Object.getPrototypeOf(a) === Object.prototype // true
function Foo() {};
var b = new Foo();
b.__proto__ === Foo.prototype
b.__proto__.__proto__ === Object.prototype
¿Cuál es el prototype
?
prototype
es un objeto creado automáticamente como una propiedad especial de una función , que se utiliza para establecer la cadena de delegación (herencia), también conocida como cadena de prototipo.
Cuando creamos una función a
, prototype
se crea automáticamente como una propiedad especial sobre a
y guarda el código de función en la que el constructor
sobre prototype
.
function Foo() {};
Foo.prototype // Object {constructor: function}
Foo.prototype.constructor === Foo // true
Me encantaría considerar esta propiedad como el lugar para almacenar las propiedades (incluidos los métodos) de un objeto de función. Esa es también la razón por funciones de utilidad en JS se definen como Array.prototype.forEach()
, Function.prototype.bind()
,Object.prototype.toString().
¿Por qué enfatizar la propiedad de una función ?
{}.prototype // undefined;
(function(){}).prototype // Object {constructor: function}
// The example above shows object does not have the prototype property.
// But we have Object.prototype, which implies an interesting fact that
typeof Object === "function"
var obj = new Object();
Así, Arary
, Function
, Object
son todas las funciones. Debo admitir que esto refresca mi impresión sobre JS. Sé que las funciones son ciudadanos de primera clase en JS, pero parece que se basa en funciones.
¿Cuál es la diferencia entre __proto__
y prototype
?
__proto__
una referencia funciona en cada objeto para referirse a su [[Prototype]]
propiedad.
prototype
es un objeto creado automáticamente como una propiedad especial de una función , que se utiliza para almacenar las propiedades (incluidos los métodos) de un objeto de función.
Con estos dos, podríamos mapear mentalmente la cadena de prototipos. Como esta imagen ilustra:
function Foo() {}
var b = new Foo();
b.__proto__ === Foo.prototype // true
Foo.__proto__ === Function.prototype // true
Function.prototype.__proto__ === Object.prototype // true
__proto__
difiere deconstructor.prototype
?