2009-09-08 7 views
2

J'écris des objets (classes je suppose) en javascript. La classe B hérite de la classe A. La classe A possède une méthode appelée isValid, et la classe B remplace cette méthode. J'utilise la fonction YUI étendre à avoir la classe B étendre la classe A.Méthodes super classe en javascript

A = function(){ 
} 
A.prototype = { 
    isValid:function(){ 
     /* Some logic */ 
     return booleanValue; 
    } 
} 

B = function(){ 
} 

YAHOO.lang.extend(B, A,{ 
    isValid:function(){ 
     // call class A's valid function 
     // some more logic for class B. 
     return booleanValue; 
    } 
}); 

Ce que je veux être en mesure de faire est d'appeler la fonction isValid de classe A à l'intérieur fonction isValid de la classe B. La question est, puis-je accéder à la méthode isValid de la classe A à partir de la méthode isValid de la classe B? Je sais que vous pouvez accéder au constructeur de la classe A de l'intérieur du constructeur de la classe B avec la ligne suivante

this.constructor.superclass.constructor.call(this,someParam); 

est quelque chose de similaire possible des méthodes? Si non, quelles sont les bonnes pratiques pour ce faire? Je réalise actuellement une méthode d'assistance appelée dans la classe super méthode isValid

A.prototype = { 
    a_isValid:function(){ 
     // class A's is valid logic 
     return booelanValue; 
    }, 
    isValid:function() {return this.a_isValid();} 
} 

Ensuite, je peux appeler la fonction a_isValid de la classe B. Cela ne fonctionne pas pour moi, mais je préférerais appeler la classe super IsValid fonction directement si possible.

Répondre

2

De YUI docs:

YAHOO.lang.extend(YAHOO.test.Class2, YAHOO.test.Class1); 
YAHOO.test.Class2.prototype.testMethod = function(info) { 
// chain the method 
YAHOO.test.Class2.superclass.testMethod.call(this, info); 
alert("Class2: " + info); 
}; 

ça ne marche pas pour vous? La 4ème ligne devrait appeler testMethod (superclasse) de Class1.

+0

Je vais essayer, merci! – Zoidberg

+0

Travaillé génial ... et fait tellement de sens, j'aurais dû le réaliser sur la base de la méthode constructeur. Merci! – Zoidberg

+0

Pouvons-nous utiliser 'this' au lieu du nom de classe complet ici? – TEXHIK

0

Je poste une autre approche à des fins de documentation.

Si messageFormController de dérive formController, vous appelez super.setView comme:

messageFormController.setView = function setView(element) { 
    formController.setView.bind(this)(element); 
    // Additional stuff 
}; 
Questions connexes