Por que eu não posso salvar métodos de um objeto como propriedades de outro objeto literal
-
08-07-2019 - |
Pergunta
O código a seguir é usado para observar alguns métodos para executar em circunstâncias particulares para que eles possam ser chamados usando uma sintaxe mais simples.
var callbacks = {alter: SPZ.sequenceEditor.saveAndLoadPuzzle,
copy: SPZ.sequenceEditor.saveAsCopyAndLoadPuzzle,
justSave:SPZ.sequenceEditor.saveAndLoadPuzzle};
Mas o código mantém retornando um objeto vazio. Eu verifiquei com console.log que os métodos são definidos. Eu também tentei mudar os nomes, invocando um objeto vazio e, em seguida, adicionando as propriedades como, por exemplo callbacks.alter, e tentou outras mudanças que não deve importar.
Por que não vai funcionar?
de erro é na linha 238 de puzzle.js
Solução
O que é exatamente o problema? Será que as propriedades sejam undefined
ou as chamadas simplesmente não funcionam corretamente?
Neste último caso, o problema é mais provável que ao chamar os métodos, this
deixarão de se referir a SPZ.sequenceEditor
, mas seu objeto callbacks
; para resolver esse problema, use a função de ajudante bind()
(como definido por vários quadros) ou embrulhar as chamadas se:
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);
}
};
O apply()
só é necessária se os métodos levam argumentos. Veja detalhes em MDC .