Entiendo que la propiedad Symbol.hasInstance se puede personalizar para verificar si un objeto es una instancia de una clase en particular. Pero lo que no entiendo es cómo funciona esto. Ejemplo:
class Animal { static [Symbol.hasInstance](obj){ // how is this obj being passes here on calling the function below if(obj.isAnimal) return true } } const a1 = new Animal(); console.log(a1 instanceOf Animal) // false a1.isAnimal = true console.log(a1 instanceOf Animal) // true Pregunta : ¿Cómo se pasa obj a la función estática al llamar a una a1 instanceOf Animal
Muchas veces se puede llamar a una función incluso si no hay nada en el código que lo haga explícitamente con () después del nombre de la propiedad. Por ejemplo, con iteradores:
class C { *[Symbol.iterator]() { for (let i = 0; i < 3; i++) yield i; } } const c = new C(); for (const item of c) { console.log(item); }Y escriba coerción:
const obj = { toString: () => 'some obj' }; console.log(String(obj));y apoderados.
const prox = new Proxy({}, { has() { console.log('has invoked'); return true; } }); console.log('foo' in prox); instanceof es solo otra de estas circunstancias.
x instanceof y se especifica para extraer primero el valor en el símbolo hasInstance de y , si existe tal valor:
- Sea instOfHandler ? GetMethod(objetivo, @@hasInstance).
y luego será invocado con x . Si el valor no existe, se llamará a OrdinaryHasInstance con x e y en su lugar. Eso es todo lo que hay que hacer: instanceof , por definición, buscará e intentará llamar a una propiedad Symbol.hasInstance si la hay.
Para casi todos los operadores, puede pensar en x someOperator y como invocando someOperator con x e y , y el operador a menudo hace una serie de cosas con los operandos detrás de escena.