2010-06-06 4 views
3

J'ai souvent besoin de passer des méthodes d'objets à d'autres objets. Cependant, je veux généralement que la méthode soit attachée à l'objet d'origine (par attaché, je veux dire 'ceci' devrait se référer à l'objet original). Je sais que quelques façons de le faire:Comment puis-je transmettre des méthodes en javascript?

a) Dans le constructeur de l'objet: ObjectA = function() { var that = this; var method = function(a,b,c) { that.abc = a+b+c }}

b) Dans objectA qui a été passé objectB: objectB.assign(function(a,b,c) { that.method(a,b,c) })

c) En dehors des deux objets: objectB.assign(function(a,b,c) { objectA.method(a,b,c) })

Je veux savoir s'il existe un moyen plus simple de transmettre des méthodes attachées à leurs objets d'origine.

Répondre

4

Vous pouvez définir une méthode "CreateDelegate" pour toutes les fonctions:

Function.prototype.createDelegate = function(scope) { 
    var method = this; 
    return function() { 
     return method.apply(scope, arguments); 
    } 
} 

Et puis utiliser comme:

var myDelegate = myFunction.createDelegate(myScope); 

appeler "myDelegate" exécutera "myFunction" avec "ce" désignant "myScope" et les mêmes arguments que passés à myDelegate

+0

Merci, c'est parfait! Bien que je ne le comprenne pas encore. – peterjwest

+0

J'ai modifié un peu, alors peut-être que c'est plus clair maintenant. Sinon, vous pouvez demander ... – ob1

+0

Il peut également être intéressant de regarder la source actuelle (1.7 RC 2) de 'Function # bind' de Prototype, qui sert le même but que' createDelegate' de ob1 mais qui a traversé ronde de tests de performance et d'optimisation il ya quelques mois: http://github.com/sstephenson/prototype/blob/master/src/lang/function.js#LC108 Séparément: j'utiliser 'scope || undefined' plutôt que 'scope || window', pour éviter la spécificité inutile du navigateur et les problèmes avec 'window' étant écrasés. Appelle 'apply' en utilisant' undefined' car la portée utilisera l'objet global. –

0

Tant que vous appelez l'autre méthode avec son objet propriétaire approprié, ce se référera toujours au propriétaire correct.

+0

Comment proposez-vous que je ferais cela? Passez l'objet et une chaîne représentant la méthode: 'assign (object, 'method')'? Je ne veux pas que le nom de la méthode soit codé en dur dans l'autre objet – peterjwest

0

Vous pouvez déléguer si vous le souhaitez, ou simplement appelez l'objet que l acks la méthode de la méthode définie scope-

instance.method.call(Other-Object/*,argument,...*/) 

Par exemple, si le tableau a une méthode de filtre, vous pouvez l'appeler comme si elle était une méthode d'un objet de la liste des noeuds.

var list=document.getElementsByTagName('p'), a=[], 

list= a.filter.call(list,function(itm){return itm.className=='sidebar'}); 
Questions connexes