65 votes

Comment et pourquoi devrais-je écrire une classe qui étend null?

JavaScript est classe syntaxe, ajouté dans l'ES6, apparemment, fait-il légal d' étendre null:

class foo extends null {}

Une recherche sur Google révèle qu'il a été suggéré sur ES de Discuter que de telles déclarations soient faites d'une erreur; toutefois, d'autres intervenants ont fait valoir pour être à gauche juridique sur la base que

quelqu'un pourrait vouloir créer une classe qui a un {__proto__: null} prototype

et de ce côté-là de l'argument finalement prévalu.

Je ne peux pas faire beaucoup de sens de cette étude de cas d'utilisation. Pour une chose, tandis que la déclaration d'une telle classe est juridique, il semble que l'instanciation d' une classe déclarée dans cette voie n'est pas. Essaie d'instancier la classe foo à partir de ci-dessus dans Node.js ou Chrome me donne l'merveilleusement daft erreur

TypeError: function is not a function

tout en faisant la même dans Firefox me donne

TypeError: function () {
} is not a constructor

Il n'aide pas à définir un constructeur de la classe, comme indiqué dans la SOCIÉTÉ de l'exemple actuel de la fonction; si j'essaie d'instancier cette classe:

class bar extends null {
  constructor(){}
}

puis Chrome/Nœud de me dire:

ReferenceError: this is not defined

et Firefox me dit:

ReferenceError: |this| used uninitialized in bar class constructor

Qu'est-ce que toute cette folie? Pourquoi sont-ils si nuls-l'extension de classes non instanciables? Et étant donné qu'ils ne sont pas instanciables, pourquoi avait la possibilité de créer délibérément laissé dans la spec, et pourquoi certains MDN auteur pense qu'il est assez remarquable de document? Quel cas est-il pour cette fonctionnalité?

27voto

Bakkot Points 890

L'instanciation de ces classes est destinée à travailler; Chrome et Firefox juste avoir des bugs. Voici de google Chrome, voici de Firefox. Il fonctionne très bien dans Safari (au moins sur le master).

Il y avait un bug dans la spec, ce qui les rendait impossible d'instancier, mais il a été fixé pour un certain temps. (Il y en a toujours un qui est lié, mais ce n'est pas ce que vous voyez.)

Le cas d'utilisation est à peu près le même que celui de l' Object.create(null). Parfois, vous voulez quelque chose qui n'héritent pas de Object.prototype.

12voto

Benjamin Gruenbaum Points 51406

Pour répondre à la deuxième partie:

Je ne peux pas faire beaucoup de sens de cette étude de cas d'utilisation.

De cette façon, votre objet n'aurez pas Object.prototype de son prototype de la chaîne.

class Hash extends null {}
var o = {};
var hash = new Hash;
o["foo"] = 5;
hash["foo"] = 5;
// both are used as hash maps (or use `Map`).
hash["toString"]; // undefined
o["toString"]; // function

Comme nous le savons, undefined , en fait, n'est pas une fonction. Dans ce cas, nous pouvons créer des objets sans craindre un appel sur un champ qui ne devrait pas être là.

C'est un modèle courant à travers Object.create(null) et est commun dans beaucoup de bases de code, y compris les grands comme NodeJS.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X