Aprendí que dependiendo de dónde definió la función, determina el alcance superior de la función ( static scope o lexical scope )
ejemplo
class Parent { constructor(name){ this.name = name } } class Child extends Parent { }en esto,
what is the upper scope of the Child class? is it Parent class or global?
Pienso...
porque la clase Child está definida en global, el alcance superior es global. pero,
De acuerdo con la cadena de prototipos, parece que el alcance superior es la clase principal.
¿Qué me estoy perdiendo?
¿Cuál es el alcance superior de la clase Child? ¿Es clase de padres o global?
Es el alcance global.
porque la clase Child está definida en global, el alcance superior es global
Sí exactamente.
Según la cadena de prototipos, parece que el alcance superior es la clase principal
Los prototipos no representan el alcance. Estás comparando manzanas y naranjas aquí.
Los prototipos son objetos que se utilizan para definir propiedades comunes para todos los objetos que se crean a partir de una función constructora particular. Ejemplo: todas las instancias de matriz comparten métodos definidos en Array.prototype .
Si no se puede encontrar una propiedad en particular en un objeto, se sigue su vínculo de prototipo y se busca esa propiedad en particular en ese objeto de prototipo.
En lo que respecta a un alcance, si un identificador particular no se puede encontrar en el alcance actual, Javascript buscará ese identificador en el alcance externo, que en el caso de la clase Child es el alcance global.
El siguiente ejemplo debería aclarar la diferencia entre el alcance y el prototipo:
function foo(arr) { // ".forEach" method will be looked-up in the "Array.prototype" arr.forEach(n => console.log(n)); // "b" will be searched for in the outer scope, ie global scope console.log(b); } const numArr = [1, 2, 3]; foo(numArr); En el ejemplo de código anterior, dentro del alcance de la función foo , arr existe en el alcance local; si no fuera así, javascript habría buscado arr en el ámbito externo, es decir, el ámbito global
En la línea siguiente, el identificador b no existe en el ámbito local de la función foo ; como resultado, javascript buscará b en el ámbito externo, es decir, el ámbito global
El método forEach se buscará primero en el objeto arr . Si javascript no puede encontrar ninguna propiedad llamada forEach en el objeto arr , se buscará en el prototipo de arr , es decir, Array.prototype