simple:
// Let's create a new object
function MyObject() {
//
}
// Add some method to this object
MyObject.prototype.myFunctionA = function() {
//
}
// Another method
MyObject.prototype.myFunctionB = function(arg) {
// AJAX GET request
var me = this;
$.get('script.php', { par : arg }, function(data) {
// use me.something instead of this.something
});
}
réutilisable (en utilisant la portée de piégeage):
function createDelegate(obj, handler)
{
return function() {
handler.apply(obj, arguments);
}
}
puis
MyObject.prototype.myFunctionB = function(arg) {
// AJAX GET request
var me = this;
$.get(
'script.php',
{ par : arg },
createDelegate(this, function(data) {
// use this.something
})
);
}
Ainsi, un code en relation avec les commentaires ci-dessous, createDelegate peut également être utilisé dans quelques dif façons férents, dont un être:
function createDelegate(obj, handler)
{
handler = handler || this;
return function() {
handler.apply(obj, arguments);
}
}
Function.prototype.createDelegate = createDelegate;
cela vous permet de faire des choses comme:
var someObj = {a:1, b:function() {return this.a;}};
var scopedDelegateForCallback = someObj.b.createDelegate(whateverobj)
vous pouvez faire des tours pour obtenir aussi des parents, mais c'est trop pour moi à embêter avec atm.
ou, vous pouvez faire quelque chose comme ceci:
function createDelegate(handler, obj)
{
obj = obj || this;
return function() {
handler.apply(obj, arguments);
}
}
Object.prototype.createDelegate = createDelegate;
et de l'utiliser:
someObj.createDelegate(someObj.b);
ou peut-être:
function createDelegateForMember(handlerName, obj)
{
obj = obj || this;
return function() {
obj[handlerName].apply(obj, arguments);
}
}
Object.prototype.createDelegate = createDelegateForMember;
puis
someobj.createDelegate("b");
J'aime votre fonction 'createDelegate', mais je pense que ce serait encore mieux si vous déplaciez le paramètre' obj' à la fin de la liste de paramètres et que vous le rendiez facultatif, par défaut 'this'. Cela permettrait d'économiser du code dans le cas d'utilisation le plus courant. – bcat
si vous ne spécifiez pas 'ceci', il est inutile d'utiliser la fonction createDelegate :) –
Non, je voulais dire quelque chose comme ceci: 'function createDelegate (gestionnaire, obj) {return function() {handler.apply (obj || ceci, arguments); } } '. Et l'appelant comme ceci: '$ .get ('script.php', {par: arg}, createDelegate (fonction (données) {/ * faire quelque chose * /})); – bcat