typeof (new (class F extends (String, Array) { })).substring
L'expression en question est liée à la nature de l'opérateur JavaScript typeof
et à la manière dont il interagit avec l'héritage de classes. L'opérateur typeof
est utilisé pour obtenir une chaîne indiquant le type d'une opérande. Par exemple, typeof 'test'
renverra 'string'
. Dans le cas de cette expression, nous examinons le typeof
d'une méthode substring
sur une nouvelle instance d'une classe anonyme qui étend à la fois String
et Array
.
Dans l'expression donnée, l'opérande de typeof
est une nouvelle instance d'une classe qui est dérivée de String
et Array
.
new (class F extends (String, Array) { })
Cette classe anonyme utilise une extension d'une liste d'expressions, (String, Array)
. En JavaScript, lorsqu'une liste d'expressions est utilisée, seulement la dernière est utilisée pour déterminer la valeur. Donc en réalité, notre classe anonyme n'étend que Array
, pas String
.
Si nous essayons d'appeler la méthode substring
(une méthode de String
, non d'Array
) sur une instance de cette classe, nous obtiendrons undefined
.
Quand nous vérifions le typeof
d'une propriété ou méthode qui n'est pas définie sur une instance d'objet, JavaScript renvoie 'undefined'
. Comme substring
n'est pas une méthode définie sur l'objet (qui est, encore une fois, un Array
pas un String
), la bonne réponse au quiz est "undefined"
.
Dans les bonnes pratiques de développement JavaScript, l'extension multiple n'est généralement pas recommandée. JavaScript n'étant pas conçu pour supporter l'héritage multiple directement, des erreurs et des comportements imprévisibles peuvent survenir.
Il serait plus judicieux d'étendre une classe à la fois et d’utiliser des mélanges ou des compositions pour ajouter des fonctionnalités supplémentaires si nécessaire.
En outre, utiliser typeof
pour déterminer le type d'un objet peut être utile, mais il faut faire attention à son utilisation sur des méthodes ou propriétés non définies. Un code robuste doit être capable de gérer de tels cas sans provoquer d'erreurs.