为什么我不能将对象的方法保存为另一个对象文字的属性

时间:2009-11-29 21:35:20

标签: javascript function methods object-literal

下面的代码用于说明在特定情况下运行的一些方法,因此可以使用更简单的语法调用它们。

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

但是代码不断返回一个空对象。我已经使用console.log检查了方法的定义。我也试过更改名称,调用一个空对象,然后添加属性,例如callbacks.alter,并尝试了其他无关紧要的更改。

为什么这不起作用?

Demo

错误在puzzle.js的第238行

1 个答案:

答案 0 :(得分:2)

究竟是什么问题?属性是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