为arguments对象添加值

时间:2014-08-08 08:29:06

标签: javascript backbone.js arguments

我在JavaScript方法中向参数objekt添加值时遇到问题。

我试图为Backbone.Model.fetch()方法添加额外的成功回调,我的模型如下所示:

models.Settings = Backbone.Model.extend({
    url: "path/to/settings.json",

    dataLoaded: function() {
        this.set({
            data: new collections.Data( this.get("data") )
        });
    },

    fetch: function() {
        var
            cb;

        if(!arguments.length) arguments[0] = {};

        if(arguments[0].hasOwnProperty('success')) {
            cb = arguments[0].success;
        }

        arguments[0].success = function() {
            this.dataLoaded();
            if(typeof cb === 'function') cb.apply(undefined, arguments);
        }.bind(this);

        models.Settings.__super__.fetch.apply(this, arguments);
    }
});

只要将值(任何值)传递给fetch(),代码就可以正常工作。当arguments对象最初为空时会发生此问题。我可以设置arguments[0]success值,as I'm supposed to。但回调永远不会运行。

我错过了什么?

1 个答案:

答案 0 :(得分:2)

arguments属性是一个对象,而不是数组,这意味着当您设置arguments[0] = {};时,它看起来像(http://jsfiddle.net/nikoshr/n93wfm8a/

{
    0: {}
}

但是,models.Settings.__super__.fetch.apply需要一个数组(或至少一个length属性与内容匹配)并且不会得到它。

解决方案

  1. 最苛刻的是,设置length属性:

    if(!arguments.length) {
        arguments[0] = {};
        arguments.length = 1;
    }
    

    http://jsfiddle.net/nikoshr/n93wfm8a/1/

  2. 稍微好一点,用数组

    初始化arguments
    if(!arguments.length) {
        arguments = [{}];
    }
    

    http://jsfiddle.net/nikoshr/n93wfm8a/2/

  3. 重写整个内容以利用方法的签名model.fetch([options])并使用Function.prototype.call

    fetch: function(opts) {
        var cb;
        opts = opts || {};
    
        if (opts.hasOwnProperty('success')) {
            cb = opts.success;
        }
    
        opts.success = function() {
            this.dataLoaded();
            if(typeof cb === 'function') cb.apply(this, arguments);
        }.bind(this);
    
        Settings.__super__.fetch.call(this, opts);
    }
    

    http://jsfiddle.net/nikoshr/n93wfm8a/4/