Почему я не могу сохранить методы объекта как свойства другого литерала объекта - PullRequest
0 голосов
/ 30 ноября 2009

Приведенный ниже код используется для обозначения некоторых методов, запускаемых в определенных обстоятельствах, чтобы их можно было вызывать с использованием более простого синтаксиса.

var callbacks = {alter: SPZ.sequenceEditor.saveAndLoadPuzzle,
                 copy: SPZ.sequenceEditor.saveAsCopyAndLoadPuzzle,
           justSave:SPZ.sequenceEditor.saveAndLoadPuzzle};

Но код продолжает возвращать пустой объект. Я проверил с console.log, что методы определены. Я также попытался изменить имена, вызвать пустой объект и затем добавить свойства, например, callbacks.alter, и пробовал другие изменения, которые не должны иметь значения.

Почему это не сработает?

Демо

ошибка в строке 238 головоломки.js

1 Ответ

2 голосов
/ 30 ноября 2009

В чем именно проблема? Свойства будут undefined или вызовы будут работать неправильно?

Если последнее, проблема, скорее всего, заключается в том, что при вызове методов this больше не будет ссылаться на SPZ.sequenceEditor, но на ваш callbacks объект; Чтобы решить эту проблему, используйте вспомогательную функцию bind() (как определено несколькими платформами) или оберните вызовы самостоятельно:

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);
    }
};

apply() необходим, только если методы принимают аргументы. Подробности см. На MDC .

...