En realidad, hay dos tipos diferentes de "prototipo" en JavaScript:
- Uno de ellos es el enlace "oculta" cada objeto tiene (vamos a utilizar para representar
[[Prototype]]
este enlace oculto). los literales de objetos de forma predeterminada tienen sus enlaces ocultos apuntando a Object.prototype
, los objetos de función tienen su enlace oculto apuntando a Function.prototype
, y los arreglos tienen el apuntando a Array.prototype
. Estos prototipos de enlaces ocultos no están relacionados con las propiedades con el nombre "prototipo". No puede cambiar estos enlaces ocultos agregando o modificando o.prototype
.
- Otra es que todos los objetos de función tienen automáticamente una propiedad especial llamada "
prototype
". Esto es principalmente para el uso del patrón de invocación del constructor.
[[Prototype]]
se utiliza para buscar propiedades (como el padre en la jerarquía clásica), siempre que una propiedad no se puede encontrar en un objeto, su [[Prototype]]
se busca su lugar.Un escenario de uso: supongamos que desea agregar una propiedad a todos los objetos, simplemente puede agregarlo a Object.prototype
, que se aplicaría automáticamente a todos los objetos, ya que todos los objetos de alguna manera tienen Object.prototype
como su raíz de cadena [[Prototype]]
.
Permite volver a la propiedad de objetos "prototype
". Solo es útil cuando se usa con el operador new
. Tomemos el siguiente fragmento de código como ejemplo:
function F() {} // function declaration
// F now has a property named "prototype"
var f = new F(); // use "new" operator to create a new function object based on F
Lo new F()
hace lo anterior es que crear primero un nuevo objeto función, ajuste el [[Prototype]]
(enlace oculto) de este objeto función de nueva creación para ser F.prototype
, y luego devolver el nuevo objeto de función. Esto es probablemente lo que ya entiende que funciona para objetos funcionales.
¿Recuerdas que dije que no podemos cambiar el [[Prototype]]
de los objetos? Bueno, al menos no directamente. La función Object.create
de Crockford hace precisamente eso, al utilizar el hecho de que el operador new
podría ayudarnos a configurar [[Prototype]]
. Entonces, al usar Object.create
, debes indicar deliberadamente a dónde debe apuntar el enlace oculto de tu nuevo objeto. (De alguna manera, siento que quieres indicar quién es tu clase principal)
En tu ejemplo, conf
es un objeto literal y conf.prototype
no es realmente útil. Aquí hay otra versión que utiliza el estilo clásico:
function ConfBase() {}
ConfBase.prototype.d = 16;
var conf = new ConfBase();
conf.a = 2;
conf.b = 4;
document.writeln(conf.a);
document.writeln(conf.b);
document.writeln(conf.d);
En comparación con la respuesta de @CMS, yo prefiero usar Object.create
. Pero esencialmente los 2 estilos están usando el mismo mecanismo subyacente, solo que Object.create
ayuda a ponerlo en orden.
¿Podría el infractor por favor dejar un comentario? Siempre estoy buscando mejorar mis respuestas :) – CMS