Émuler super en javascript

Fondamentalement, est-il un bon mécanisme élégant pour émuler super avec la syntaxe est aussi simple que l'une des opérations suivantes

  • this.$super.prop()
  • this.$super.prop.apply(this, arguments);

Critères à respecter sont :

  1. this.$super doit être une référence pour le prototype. c'est à dire si je change le super prototype au moment de l'exécution de ce changement pourra être répercuté. Ceci signifie fondamentalement, il le parent a une nouvelle propriété, alors cela devrait être indiqué au moment de l'exécution sur tous les enfants par le biais de super comme une codés en dur de référence à la société mère de refléter les changements
  2. this.$super.f.apply(this, arguments); doivent travailler pour les appels récursifs. Pour toute enchaînés ensemble de l'héritage où plusieurs super les appels sont faits que vous allez en haut de la chaîne d'héritage, vous ne devez pas frapper le récursive problème.
  3. Vous ne devez pas coder en dur des références à des super objets de vos enfants. I. e. Base.prototype.f.apply(this, arguments); défaites le point.
  4. Vous ne devez pas utiliser un X à compilateur JavaScript ou des scripts JavaScript préprocesseur.
  5. Doit être ES5 conforme

L'implémentation naïve serait quelque chose comme ceci.

var injectSuper = function (parent, child) {
  child.prototype.$super = parent.prototype;
};

Mais ce les sauts de la condition 2.

Le plus élégant mécanisme que j'ai vu à ce jour est IvoWetzel de eval hack, qui est à peu près un JavaScript préprocesseur et échoue donc les critères 4.

  • juste curieux, mais est-il une raison pourquoi vous avez besoin d'émuler super en JavaScript? compte tenu de la façon dont la chaîne de prototype fonctionne, il me semble complètement inutile.
  • super est simplement une construction pour le code de la réutilisation. C'est la seule chose qui me manque dans OO sucre pour l'ES5. ES6 apporte super et je suis impatient de ce
  • Votre naïveté de mise en œuvre de casse également les critères 1.
  • comment?
  • injectSuper(P, C); x = new C(); C.prototype = {}; alert(x.$super.constructor === P); y = new C(); alert(y.$super === undefined); Émet également vrai pour les deux.
  • bien sûr, il n'. condition on a seulement besoin de refléter les changements apportés à P. Si vous écrasez C.prototype puis sa rupture. ce comportement est normal et c'est stupide d'écrire du code comme ça
  • J'ai mal compris ce que tu voulais dire par la modification de la super prototype. Il peut être compris de la façon dont j'ai pensé à l'origine, dans le sens que vous êtes littéralement changer pour quelque chose d'autre au lieu de modifier ce qui existe déjà.
  • J'aime la façon dont vous critiquez chaque réponse, mais vous n'avez vraiment aucune idée de comment le faire vous-même. Parler de la critique constructive euh?
  • o/ Oui, je suis sévère. J'ai eu un bon coup d'oeil à la façon de le faire, et j'ai trouvé tout un tas de pièges. Je contribue activement à la liste des pièges et d'autres personnes encore à l'étape en eux. Donc oui, ils arrivent à être critiqué.
  • peut-être que ce est pourquoi la plupart donnent sur l'émulation "classique" de l'héritage en javascript. En fin de compte vous lier le code dans les noeuds pour répondre à des critères pour le classique OO sans vraiment de la résolution d'un pracitcal problème (à moins que la question était de mettre en œuvre classique OO pour l'amour d'elle).
  • Ce n'est pas "classique" de l'héritage en tant que tel, plus d'un code de ré-utiliser le mécanisme. Et il peut être fait, vous avez juste à remplacer chaque méthode unique de lexicalement le lier à un bon de la valeur de super. En gros, c'est en essayant d'imiter ES6 super.
  • J'ai fait un code qui a passé tous les tests et qu'il cesse de répondre dans les commentaires... Downvote
  • Vous pouvez utiliser Function.call facilement dans ECMAScript5, jetez un oeil ici: stackoverflow.com/questions/7486825/javascript-inheritance/...

InformationsquelleAutor Raynos | 2011-11-07