Quel sera le résultat de cette expression ?
typeof (new (class F extends (String, Array) { })).substring

Comprendre l'opérateur JavaScript "typeof" et l'héritage de classes

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.

Explication de l'expression

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.

Pourquoi "undefined" est la bonne réponse ?

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".

Bonnes Pratiques

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.

Trouvez-vous cela utile?