const person = { isHuman: false, name:"Jon", printIntroduction: function() { console.log(this.name); } }; const me = Object.create(person); me.name = 'Matthew'; me.isHuman = true; delete me.name me.printIntroduction();salida: "Jon"
Cuando elimino la propiedad de nombre del objeto "yo", ¿por qué apunta a la propiedad de nombre del objeto persona?
por favor sugiera un buen material de referencia para entender esto.
Porque "persona" es el prototipo del "yo"-objeto. Si no se encuentra una propiedad en un objeto (debido a la eliminación), JS está buscando la cadena de prototipos para esa propiedad. Es por eso que obtienes a "Jon".
Referencia: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain
Object.create() crea un nuevo objeto utilizando un objeto existente como prototipo del nuevo objeto que crea.
Las propiedades del prototipo no se copian en el nuevo objeto creado por Object.create() . La herencia de prototipos funciona vinculando el nuevo objeto a su objeto prototipo.
Cuando se crea, me no tiene ninguna propiedad propia. Hereda las propiedades de person y esto es visible si ejecutas me.printIntroduction() inmediatamente después de const me = Object.create(person); .
Cuando se lee una propiedad (atributo o función) del nuevo objeto (p. ej console.log(me.name) ), el intérprete busca la propiedad ( name ) en el objeto ( me ). Si tal propiedad no existe, la busca en el prototipo (que es el objeto person en este caso). La búsqueda de la propiedad en el objeto prototipo funciona igual; si no se encuentra allí, se busca en el prototipo del objeto prototipo y así sucesivamente hasta que llega a la raíz de la cadena de prototipos.
Cuando se establece una propiedad en el objeto, la cadena de prototipos ya no se recorre. Se establece directamente en el objeto utilizado en la declaración. Lo mismo sucede cuando se elimina una propiedad.
Use Object.getOwnPropertyNames() para encontrar la lista de nombres de propiedad que son me y no heredados de la person :
const person = { isHuman: false, name:"Jon", printIntroduction: function() { console.log(this.name); } }; const me = Object.create(person); me.printIntroduction(); console.log({ own_properties_after_creation: Object.getOwnPropertyNames(me)}); me.name = 'Matthew'; me.isHuman = true; me.printIntroduction(); console.log({ own_properties_after_set: Object.getOwnPropertyNames(me)}); delete me.name me.printIntroduction(); console.log({ own_properties_after_delete: Object.getOwnPropertyNames(me)});Obtenga más información sobre la herencia de prototipos en JavaScript en la documentación de JavaScript.