orientado - ¿Un nuevo objeto en Javascript tiene una propiedad prototipo?
lista de objetos javascript (3)
Esta es una pregunta puramente trivial para el valor académico:
Si creo un nuevo objeto, ya sea haciendo:
var o = { x:5, y:6 };
o
var o = Object.create({ x:5, y:6 });
cuando o.prototype
propiedad o.prototype
, obtengo undefined
. Pensé que cualquier objeto recién creado hereda automáticamente el prototipo Object.prototype
.
Además, la invocación a toString()
, (un método de Object.prototype
) en este objeto funciona bien, lo que implica que o
se hereda de Object.prototype
. Entonces, ¿por qué me quedo undefined
?
Hay una diferencia entre las instancias y sus constructores.
Al crear un objeto como {a: 1}
, está creando una instancia del constructor de Object
. Object.prototype
está disponible, y todas las funciones dentro de ese prototipo están disponibles:
var o = {a: 1};
o.hasOwnProperty === Object.prototype.hasOwnProperty; // true
Pero Object.create
hace algo diferente. Crea una instancia (un objeto), pero inserta una cadena de prototipo adicional:
var o = {a: 1};
var p = Object.create(o);
La cadena será:
Object.prototype - o - p
Esto significa que:
p.hasOwnProperty === Object.prototype.hasOwnProperty; // true
p.a === o.a; // true
Para obtener el prototipo "debajo" de una instancia, puede usar Object.getPrototypeOf
:
var o = {a: 1};
var p = Object.create(o);
Object.getPrototypeOf(p) === o; // true
Object.getPrototypeOf(o) === Object.prototype; // true
(Anteriormente, podría acceder al prototipo de una instancia con o.__proto__
, pero esto ha quedado en desuso).
Tenga en cuenta que también puede acceder al prototipo de la siguiente manera:
o.constructor === Object; // true
Asi que:
o.constructor.prototype === Object.prototype // true
o.constructor.prototype === Object.getPrototypeOf(o); // true
Esto falla para los objetos Object.create
con Object.create
porque no tienen un constructor (o, más bien, su constructor es Object
y no lo que usted pasó a Object.create
porque la función del constructor está ausente).
JavaScript tiene dos tipos de objetos: objeto de función y objeto sin función. Conceptualmente, todos los objetos tienen un prototipo ( NO ES UNA PROPIEDAD DE PROTOTIPO ). Internamente, JavaScript nombra el prototipo de un objeto como [[Prototipo]] .
Hay dos enfoques para obtener cualquier objeto (incluido el objeto no funcional) [[prototype]]: el método Object.getPrototypeOf () y la propiedad __proto__
. La propiedad __proto__
es compatible con muchos navegadores y Node.js. Se debe estandarizar en ECMAScript 6.
Sólo un objeto de función (un objeto que se puede llamar) tiene la propiedad prototipo . Esta propiedad prototipo es una propiedad regular que no tiene relación directa con el [[prototipo] propio de la función. Cuando se utiliza como constructor (después del nuevo operador), la propiedad prototipo de la función se asignará al [[Prototipo]] de un objeto recién creado. En un objeto que no funciona, la propiedad prototipo no está definida. Por ejemplo,
var objectOne = {x: 5}, objectTwo = Object.create({y: 6});
Tanto objectOne como objectTwo son objetos sin función, por lo que no tienen una propiedad de prototipo .
No es una respuesta directa, pero se debe tener en cuenta a todo el mundo que tenga que lidiar con la herencia en Javascript.
La herencia de prototipos en Javascript es un concepto complicado. Hasta ahora, ha sido imposible crear un objeto vacío (por vacío, me refiero a que carecen de las propiedades del objeto a través del prototipo). Esto significa que la creación de un nuevo objeto siempre tuvo un enlace al prototipo original del objeto. Sin embargo, de acuerdo con la especificación, la cadena de prototipos de una instancia de objeto no está visible, pero algunos proveedores han decidido implementar sus propias propiedades de objeto de propiedad para que pueda seguirla, pero se recomienda encarecidamente que no la use en el código de producción.
El siguiente código de ejemplo muestra solo dos formas de crear una instancia de objeto.
var someObject = {};
var otherObject = new Object();
var thirdObject = Object.create({});
Aunque no agregue manualmente las propiedades del objeto a las llaves vacías, todavía se le agrega automáticamente la cadena de prototipo. Lo mismo ocurre con el segundo ejemplo. Para visualizarlo mejor, puede escribir esas líneas en la consola de Chrome y luego ingresar someObject
, otherObject
o thirdObject
para ver los detalles. Chrome muestra la cadena de prototipos agregando una propiedad patentada __proto__
que puede expandir para ver qué se hereda y de dónde proviene. Si ejecutaste algo como
Object.prototype.sayHello = function() {
alert(''hello'');
};
usted podría llamarlo en todos los casos, ejecutando otherObject.sayHello()
.
Sin embargo, al utilizar algo que se implementó recientemente (por lo tanto, no es compatible con todos los navegadores), puede crear una instancia de objeto realmente vacía (no se hereda ni siquiera del propio Objeto).
var emptyObject = Object.create(null);
Cuando lo ingresas en la consola de Chrome y luego emptyObject
el emptyObject
para ver su cadena de prototipo, puedes ver que no existe. Entonces, incluso si implementara la función sayHello
en el prototipo de Objeto, sería imposible llamar a emptyObject.sayHello()
ya que emptyObject
no hereda del Prototipo de Objeto.
Espero que ayude un poco con la idea general.