在骨干网中创建新模型?

时间:2014-07-03 04:57:36

标签: javascript object backbone.js new-operator

我想基于某个参数创建一个新模型。 JSBin Demo

var M1 = Backbone.Model.extend({
  defaults: { type: 'one', value: 1 }
});

var M2 = Backbone.Model.extend({
  defaults: { type: 'two', value: 2 }
});

var getModel = function(type) {
  var map = { 'one': M1, 'two': M2 };
  return map[type];
};

// Error in this line (Undefined is not a function)
var model = new getModel('two')();

console.log(model.get('value'));

我尝试了几种符号,但无法确定原因。

1。这很好用

var mapModel = {
  'one': M1,
  'two': M2
};

new mapModel['two']();

2。不起作用

var model = new (getModel('two')());
var model = (new getModel('two'))();

我不明白什么是不义之物以及为什么我会看到这个错误。

3 个答案:

答案 0 :(得分:1)

我认为这种情况最好更新getModel函数并委托创建模型实例。让我们从getModel创建工厂

var getModel = function(type) {
    var map = { 'one': M1, 'two': M2 };
    return new map[type];
};

然后你可以用它来获得正确类型模型的新实例:

var model = getModel('two');

答案 1 :(得分:0)

我有理由,我正面临这个问题。让我们一个一个地理解错误。 Working JSbin

我们需要完全理解新运算符的优先级。

样本#1

var model = new getModel('two')();

在这种情况下,new与getModel方法一起使用,我们尝试再次调用new getModel('two)返回的内容。

样品#2,#3

var model = new (getModel('two')());
var model = (new getModel('two'))();

在这些情况下,首先调用从getModel('two')返回的内容,然后创建实例。

<强>解决方案

var model = new (getModel('two'))();

答案 2 :(得分:0)

如何在此工厂函数中包装new运算符?

function createModel() {
  var object = new (arguments[0]);
  (arguments[0]).apply(object, [arguments[1]]);
  return object;
}

var model = createModel(getModel('two'));
var model2 = createModel(getModel('two'), { value: 4 });
console.log(model.get('value')); // 2
console.log(model2.get('value')); // 4

修改 您还可以将工厂方法与当前的getModel

组合使用
var getModel = function() {
   var map = {
     'one': M1,
     'two': M2
   };
   var type = arguments[0];
   var M = map[type];
   var obj = new M;
   M.apply(obj, [arguments[1]]);
   return obj;
};
var model = getModel('two');
console.log(model.get('value')); // 2
var model2 = getModel('two', { value : 4});
console.log(model2.get('value')); // 4