Pourquoi ne puis-je pas enregistrer les méthodes d'un objet en tant que propriétés d'un autre littéral d'objet?
-
08-07-2019 - |
Question
Le code ci-dessous est utilisé pour noter certaines méthodes à exécuter dans des circonstances particulières afin de pouvoir être appelées à l'aide d'une syntaxe plus simple.
var callbacks = {alter: SPZ.sequenceEditor.saveAndLoadPuzzle,
copy: SPZ.sequenceEditor.saveAsCopyAndLoadPuzzle,
justSave:SPZ.sequenceEditor.saveAndLoadPuzzle};
Mais le code renvoie toujours un objet vide. J'ai vérifié avec console.log que les méthodes sont définies. J'ai également essayé de modifier les noms, d'appeler un objet vide, puis d'ajouter les propriétés, par exemple, callbacks.alter, et d'essayer d'autres modifications qui ne devraient pas avoir d'importance.
Pourquoi ça ne marche pas?
erreur est sur la ligne 238 de puzzle.js
La solution
Quel est exactement le problème? Les propriétés seront-elles non définies
ou les appels ne fonctionneront-ils pas correctement?
Si ce dernier point, le problème est probablement que lors de l'appel des méthodes, this
ne fera plus référence à SPZ.sequenceEditor
, mais à vos rappels
objet; pour résoudre ce problème, utilisez la fonction d'assistance bind ()
(définie par plusieurs frameworks) ou encapsulez vous-même les appels:
var callbacks = {
alter: function() {
return SPZ.sequenceEditor.saveAndLoadPuzzle.apply(
SPZ.sequenceEditor, arguments);
},
copy: function() {
return SPZ.sequenceEditor.saveAsCopyAndLoadPuzzle.apply(
SPZ.sequenceEditor, arguments);
},
justSave: function() {
return SPZ.sequenceEditor.saveAndLoadPuzzle.apply(
SPZ.sequenceEditor, arguments);
}
};
Le apply ()
n'est nécessaire que si les méthodes prennent des arguments. Voir les détails à l'adresse MDC .