Mientras lee https://developer.mozilla.org/en -US / docs / Learn / JavaScript / Objects / Inheritance Vi que deberíamos reemplazar el prototipo de Teacher por uno nuevo, que tiene su prototipo configurado en Person:

Teacher.prototype = Object.create(Person.prototype);
Object.defineProperty(Teacher.prototype, 'constructor', { 
    value: Teacher, 
    enumerable: false, // so that it does not appear in 'for in' loop
    writable: true });

Prefiero hacerlo de esta manera, me parece más lógico:

Teacher.prototype.__proto__ = Person.prototype

Por lo que tengo entendido, termina con el mismo resultado y el constructor se mantiene correcto, no tengo que reemplazarlo.

¿Hay alguna diferencia entre el enfoque de MDN y el mío?

//EDITAR Como señaló @ Asutosh, MDN desalienta el uso de __proto__ (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto). Sin embargo, MDN también dice usar Object.setPrototypeOf en su lugar. Entonces, puedo hacer esto:

Object.setPrototypeOf(Teacher, Person.prototype)

En lugar de original

Teacher.prototype = Object.create(Person.prototype);
Object.defineProperty(Teacher.prototype, 'constructor', { 
    value: Teacher, 
    enumerable: false, // so that it does not appear in 'for in' loop
    writable: true });
1
Loreno 16 ago. 2020 a las 18:16

2 respuestas

La mejor respuesta

¿Puedo simplemente hacer Object.setPrototypeOf(Teacher, Person.prototype)?

No, tendría que ser

Object.setPrototypeOf(Teacher.prototype, Person.prototype);

¿Puedes usar eso? Sí, está totalmente bien y básicamente equivale a la definición de Object.create + .constructor.

Entonces, ¿por qué no es este el enfoque estándar? Principalmente porque Object.create estaba disponible desde ES5, y Object.setPrototypeOf solo se introdujo con ES6, pero en ES6 solo usaríamos class Teacher extends Person de todos modos.

1
Bergi 16 ago. 2020 a las 15:31

Recuerde que en JavaScript, un prototipo no es un concepto de un objeto futuro (como una clase), es una instancia real que tiene estado y comportamiento. Crear una nueva instancia no se trata tanto de la herencia como del estado específico de una instancia en particular.

Si no crea una nueva instancia para el prototipo, puede terminar con su nuevo objeto compartiendo una instancia de prototipo específica con otras instancias de objeto no deseadas. Los cambios en el estado de esa instancia específica también afectarían inmediatamente a su objeto.

Al configurar el prototipo en una nueva instancia de un objeto, obtiene acceso a la cadena de herencia correcta, pero con una instancia nueva y limpia que no se comparte con ninguna otra implementación.

Consulte esto para obtener más información.

1
Scott Marcus 16 ago. 2020 a las 15:29