向参数对象添加值

Adding value to the arguments object

本文关键字:添加 对象 参数      更新时间:2023-09-26

我在JavaScript方法中为参数对象添加值时遇到问题。

我试图添加一个额外的成功回调到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的值,因为我应该。但是回调永远不会运行。

我错过了什么?

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/