Mirando este código simple:
class Animal { someField = 42; animalFunc() { console.log('animal') } } class Lion extends Animal { lionFunc() { console.loge('lion') } } let lion = new Lion(); console.log(lion)
El resultado en Chrome es:
Como podemos ver, los métodos de instancia están en el prototipo (para cada función constructora)
Pregunta:
¿Por qué los campos, a diferencia de los métodos, no están en el prototipo?
Quiero decir, someField
está en Animal
, no en Lion
.
Este es el comportamiento previsto como se ve en ECMAScript - 15.7.14 Runtime Semantics: ClassDefinitionE Evaluation 25.f
:
f. Else if element is a ClassFieldDefinition Record, then i. If IsStatic of e is false, append element to instanceFields. ii. Else, append element to staticElements.
y en 29.
:
Set F.[[Fields]] to instanceFields.
Entonces, después de ver que esto no es un error, veamos por qué:
En palabras simples:
Como sabemos, si tenemos una función en el prototipo y cambiamos el valor de esa función, se cambiaría para todos.
Si colocamos la propiedad en el prototipo y alguna instancia cambia el valor de la propiedad, también cambiaría el valor de la propiedad en otras instancias y, naturalmente, este comportamiento no debería ocurrir, por lo que colocamos las propiedades en la instancia misma.
Para las propiedades estáticas, este es el comportamiento previsto, ya que solo tenemos una instancia de ellas, por eso están en el prototipo.
Extra:
este comentario de Ranando D Washington-King de la propuesta de campos de clase
La cita que menciono es sobre el problema de agregar una propiedad de datos x
al prototipo [...] :
Cada instancia tiene una copia del objeto. La expectativa puede o no ser exactamente eso. Considere en Java, la capacidad de definir clases anidadas. En ese caso, definitivamente es el deseo de que cada instancia pueda ver exactamente la misma definición de clase. Por otro lado, considere asignar una matriz vacía. La intención probable es que cada instancia tenga su propia copia de esa matriz para almacenar valores específicos de la instancia.