Pour hériter d'un autre objet Javascript, Node.js's EventEmitter en particulier, mais vraiment tout objet en général, vous devez faire deux choses:
- fournir un constructeur pour votre objet, qui a complètement initialise l'objet; dans le cas que vous êtes à hériter de quelque autre objet, vous voulez probablement à déléguer une partie de cette initialisation de travail pour le super constructeur.
- fournir un prototype de l'objet qui sera utilisé comme l'
[[proto]]
pour les objets créés à partir de votre constructeur; dans le cas que vous êtes à hériter de quelque autre objet, vous voudrez probablement utiliser une instance de l'autre objet que votre prototype.
C'est plus compliqué en Javascript qu'il n'y paraît dans d'autres langues parce que
- Javascript sépare le comportement des objets en "constructeur" et "prototype". Ces concepts sont conçus pour être utilisés ensemble, mais peuvent être utilisés séparément.
- Javascript est un très malléable, la langue et les gens l'utilisent différemment et il n'existe pas de véritable définition de ce qu'est "l'héritage".
- Dans de nombreux cas, il peut s'en sortir en faisant un sous-ensemble de ce qui est correct, et vous trouverez des tonnes d'exemples à suivre (y compris certains autres réponses à cette SORTE de question) qui semblent bien fonctionner pour votre cas.
Pour le cas spécifique de Node.js's EventEmitter, voici ce qui fonctionne:
var EventEmitter = require('events').EventEmitter;
var util = require('util');
// Define the constructor for your derived "class"
function Master(arg1, arg2) {
// call the super constructor to initialize `this`
EventEmitter.call(this);
// your own initialization of `this` follows here
};
// Declare that your class should use EventEmitter as its prototype.
// This is roughly equivalent to: Master.prototype = Object.create(EventEmitter.prototype)
util.inherits(Master, EventEmitter);
Possible faiblesses:
- Si vous utilisez set le prototype de votre sous-classe (Maître.prototype), avec ou sans l'aide d'
util.inherits
, mais ne l'appelez pas la super constructeur (EventEmitter
) pour les instances de votre classe, ils ne sont pas correctement initialisé.
- Si vous appelez la super constructeur mais ne réglez pas le prototype, EventEmitter méthodes ne fonctionnent pas sur votre objet
- Vous pouvez essayer d'utiliser un initialisé instance de la super-classe (
new EventEmitter
) Master.prototype
au lieu d'avoir le sous-classe constructeur Master
appelez le super constructeur EventEmitter
; selon le comportement de la superclasse constructeur qui peut sembler comme il fonctionne bien pendant un certain temps, mais n'est pas la même chose (et ne fonctionnera pas pour EventEmitter).
- Vous pouvez essayer d'utiliser le super prototype directement (
Master.prototype = EventEmitter.prototype
) au lieu d'ajouter une couche supplémentaire de l'objet par Objet.créer; ce qui pourrait sembler comme s'il fonctionne bien jusqu'à ce que quelqu'un monkeypatches votre objet Master
et a, par inadvertance, aussi monkeypatched EventEmitter
et tous ses autres descendants. Chaque "classe" doit avoir son propre prototype.
Nouveau: pour hériter de EventEmitter (ou vraiment tout objet existant "classe"), que vous souhaitez définir un constructeur qui est lié à la super constructeur et fournit un prototype qui est dérivé de la super prototype.