2010-05-06 3 views
9

Existe-t-il un moyen d'accéder à l'objet super lors de l'extension d'objets à l'aide de $ .extend?JQuery - Étendre et accéder à la superclasse

Je souhaite étendre un objet, redéfinir une méthode, mais appeler la méthode de superclasse substituée dans la méthode de sous-classe.

Répondre

6

Non, car il n'y a pas de super-classe. Selon les documents pour jQuery.extend:

Description: Fusionner le contenu de deux objets ou plus ensemble dans le premier objet.

Pour appeler une méthode « superclasse », vous devez conserver une copie de la « superclasse » quelque part (peut-être en tant que paramètre dans l'objet « descendant »), et appeler la méthode directement sur la "superclasse".

+0

Je suppose que je suis juste étends un objet avec un autre, et ne pas traiter avec les classes de la façon dont Mootools le fait, donc cela aurait du sens. – Steve

3

Si vous recherchez l'héritage javascript, vous pouvez être intéressé par this post de John Resig.

+0

Bien que très intéressant, je vais risquer de paraître idiot disant que tout cela ressemble à un plan à mettre en œuvre en javascript de 2008. Auriez-vous des références sur la façon dont il a été mis en œuvre, si c'était vraiment le cas? – cregox

1

Non directement - l'ancienne méthode n'est plus disponible (sauf dans l'objet d'origine).

Je l'ai fait deux choses: La première consiste à faire une copie de l'ancienne méthode avec un nouveau nom dans la sous-classe:

var Super = { 
    a: function() {...} 
}; 

var _SubFuncs: { 
    _superA: Super.a 

    a: function() {... this._superA(...) ... } 
}; 

var Sub = $.extend(false, Super, _SubFuncs); 

L'autre chose que je l'ai fait au besoin est d'utiliser la modèle de modèle et ont la super classe appellent une méthode qui pour cela n'a pas de comportement. La sous-classe ajoute ensuite un comportement à la méthode vide. Cela ne fonctionne que si votre structure d'appel est telle que des "trous" peuvent être ajoutés de manière appropriée. Edit: Dans mon cas, j'essayais vraiment de coller avec des objets prototypiques, donc j'évitais une solution générale qui rend mes objets plus classe.

Questions connexes