Est-il possible d'appeler la méthode de base à partir d'une méthode prototype en JavaScript si elle a été remplacée?
MyClass = function(name){
this.name = name;
this.do = function() {
//do somthing
}
};
MyClass.prototype.do = function() {
if (this.name === 'something') {
//do something new
} else {
//CALL BASE METHOD
}
};
javascript
prototype
overriding
markvpc
la source
la source
Réponses:
Je n'ai pas compris exactement ce que vous essayez de faire, mais normalement, la mise en œuvre d'un comportement spécifique à un objet se fait dans le sens suivant:
la source
Eh bien, une façon de le faire serait d'enregistrer la méthode de base, puis de l'appeler à partir de la méthode surchargée, comme ceci
la source
_do_base
stocke une référence à la fonction définie auparavant. S'il n'y en avait pas, ce serait le casundefined
. JavaScript ne l'est pas - lesmake
expressions ne sont jamais évaluées paresseusement comme vous le suggérez. Maintenant, si le prototype hérité de _do_base a également utilisé pour stocker ce qu'il pense être l'implémentation de son type de basedo
, alors vous avez un problème. Donc, oui, une fermeture serait un meilleur moyen, sûr pour l'héritage, de stocker la référence à l'implémentation de la fonction d'origine si vous utilisez cette méthode - bien que cela nécessite l'utilisationFunction.prototype.call(this)
.J'ai bien peur que votre exemple ne fonctionne pas comme vous le pensez. Cette partie:
écrase la définition de
Étant donné que l'objet nouvellement créé a déjà une propriété "do", il ne recherche pas la chaîne prototypique.
La forme classique d'héritage en Javascript est maladroite et difficile à saisir. Je suggérerais plutôt d'utiliser le modèle d'héritage simple de Douglas Crockford. Comme ça:
À mon avis, une manière beaucoup plus claire de gérer les objets, les constructeurs et l'héritage en javascript. Pour en savoir plus, consultez Crockfords Javascript: The good parts .
la source
base_do
tant que fonction, car vous perdez ainsi toutethis
liaison dans lado
méthode d' origine . Ainsi, la configuration de la méthode de base est un peu plus complexe, surtout si vous souhaitez l'appeler en utilisant l'objet de base authis
lieu de l'objet enfant. Je suggérerais quelque chose qui ressemble àbase_do.apply(me, arguments)
.var
pourbase_do
? Est-ce exprès et, si oui, pourquoi? Et, comme l'a dit @GiulioPiancastelli, cette rupture dethis
liaison à l'intérieurbase_do()
ou cet appel héritera-t-il lethis
de son appelant?var
devrait être là. Utilisercall
(ouapply
) nous permet de lierthis
correctement.Je sais que cet article date d'il y a 4 ans, mais à cause de mon expérience en C #, je cherchais un moyen d'appeler la classe de base sans avoir à spécifier le nom de la classe, mais plutôt l'obtenir par une propriété de la sous-classe. Donc mon seul changement à la réponse de Christoph serait
De ceci:
Pour ça:
la source
this.constructor
ne le pointez pas toujoursMyClass
.si vous définissez une fonction comme celle-ci (en utilisant la POO)
il y a deux façons d'appeler une fonction prototype: 1) créer une instance et appeler la fonction objet:
et l'autre façon est ... 2) appelle la fonction directement à partir du prototype:
la source
Cette solution utilise
Object.getPrototypeOf
TestA
est super qui agetName
TestB
est un enfant qui remplacegetName
mais, a aussigetBothNames
qui appelle lasuper
version degetName
ainsi que lachild
versionla source
la source
Une alternative :
la source
__proto__
(qui modifie le [[Prototype]] `d'un objet) doit être évitée. Veuillez utiliser laObject.create(...)
route à la place.Si je comprends bien, vous voulez que la fonctionnalité de base soit toujours exécutée, alors qu'une partie de celle-ci devrait être laissée aux implémentations.
Vous pourriez être aidé par le modèle de conception « méthode modèle ».
la source
Si vous connaissez votre super classe par son nom, vous pouvez faire quelque chose comme ceci:
Cela imprimera
comme prévu.
la source
Une autre façon avec ES5 est de parcourir explicitement la chaîne de prototypes en utilisant
Object.getPrototypeOf(this)
la source
Non, vous devrez donner à la fonction do dans le constructeur et à la fonction do dans le prototype des noms différents.
la source
De plus, si vous souhaitez remplacer toutes les instances et pas seulement cette instance spéciale, celle-ci peut vous aider.
résultat:
la source
la source