Por ejemplo :
class Parent { foo() { console.log("foo"); } } class Child extends Parent { bar() { console.log("bar"); } }Aquí, la expresión
Object.getPrototypeOf(Child) === Parentevaluaría como verdadero.
Ahora entiendo los conceptos básicos de la herencia prototípica y cómo funcionan las clases en Javascript, es decir, cada función tiene una propiedad prototype , que se copia en la propiedad __proto__ de la instancia de clase recién creada al llamar a la función con el new operador.
También entiendo que Object.getPrototypeOf esencialmente devuelve la propiedad __proto__ de cualquier objeto dado y, en general, simulamos la herencia en javascript puro mediante la configuración de la propiedad prototype de la clase secundaria en una instancia de la clase principal, como esta:
function Parent(){} Parent.prototype.foo = function(){ console.log("foo"); } function Child(){} // Inherit properties from Parent Child.prototype = new Parent();Mis preguntas son:
¿Qué representa el resultado de Object.getPrototypeOf cuando se llama con una clase como argumento? ¿Cómo se vincula a la herencia de clases en TS/JS?
¿Es seguro usar Object.getPrototypeOf para verificar si una clase en particular extiende otra clase en tiempo de ejecución?
La palabra clave extends hace dos cosas:
Establece el objeto SuperClass.prototype como el prototipo del objeto SubClass.prototype. En su caso, Child.prototype obtiene el objeto Parent.prototype como su prototipo.
También establece el constructor de la superclase como prototipo del constructor de la clase secundaria. En su caso, el constructor secundario Child constructores Parent como su prototipo.
Las dos declaraciones anteriores significan esencialmente lo siguiente en el código:
class Parent {} class Child extends Parent {} console.log(Object.getPrototypeOf(Child.prototype) === Parent.prototype); console.log(Object.getPrototypeOf(Child) === Parent); En otras palabras, la palabra clave extends establece dos cadenas de prototipos:
Child.prototype ---> Parent.prototype ---> Object.prototype Child ---> Parent ---> Function.prototype ---> Object.prototype Entonces, Object.getPrototypeOf(Child) simplemente Parent el constructor principal.