具有主干的类构造函数

时间:2012-01-11 05:25:26

标签: javascript backbone.js

任务

使命令paramteres可以传递给新的bb支持的对象

例如

initialize : function(foo, bar, baz){
  this.foo = foo;
  ...
}


new Foo(value0, value1, value2)

问题

是否可以不修改库源代码?

2 个答案:

答案 0 :(得分:2)

如果您检查来源,您会看到模型调用initialize,如下所示:

Backbone.Model = function(attributes, options) {
  // ...
  this.initialize(attributes, options);
};

但是Collection,Router和View称之为:

this.initialize.apply(this, arguments);

众所周知,apply就是这样做的:

  

调用具有给定this值的函数,并将arguments作为数组提供。

arguments是:

  

与传递给函数的参数对应的类数组对象。

因此对于模型而言,您仍然坚持使用标准documented interface,但对于其他模型,您可以执行以下操作:

var View = Backbone.View.extend({
    initialize: function(a, b, c, d) {
        // ...
    }
});
new View('where', 'is', 'pancakes', 'house?');

演示:http://jsfiddle.net/ambiguous/5ZD6z/

请注意,执行此操作会违反记录的CollectionRouterView接口,因此如果使用此未记录的行为导致新的有趣错误或在神秘地发生故障后不要感到惊讶升级。我建议坚持使用已记录的界面,如果真的困扰你,请编写构造函数:

function make_thing(a, b c) {
    return new Thing({
        a: a,
        b: b,
        c: c
    });
}

继续前进更有成效的事情。

答案 1 :(得分:0)

您可以将JavaScript对象作为参数传递给构造函数,看看docu for Model.extend

MyModel = Backbobe.Model.extend({
    initialize: function(options){
        this.foo = options.foo;
    }
});

//pass your options as second parameter in the constructor call
// the first parameter is used as your model data    
var myModel = new MyModel({},{foo:bar});