Javascript 在主干网中创建新模型?

Javascript 在主干网中创建新模型?,javascript,object,backbone.js,new-operator,Javascript,Object,Backbone.js,New Operator,我想根据一些参数创建一个新模型 我试过几种符号,但无法指出原因 1.这个很好用 2.不起作用 我不明白什么是未定义的以及为什么我会看到这个错误。我已经找到了原因,我正面临这个问题。让我们逐一理解错误 我们需要充分了解新运算符的优先级。 样本#1 在本例中,new与getModel方法一起使用,我们尝试再次调用newgetmodel返回的内容('two) 样本2,3 在这些情况下,首先调用从getModel('two')返回的任何内容,然后创建实例 解决方案 var model = new (ge

我想根据一些参数创建一个新模型

我试过几种符号,但无法指出原因

1.这个很好用 2.不起作用
我不明白什么是未定义的以及为什么我会看到这个错误。

我已经找到了原因,我正面临这个问题。让我们逐一理解错误

我们需要充分了解新运算符的优先级。

样本#1

在本例中,new与getModel方法一起使用,我们尝试再次调用newgetmodel返回的内容('two)

样本2,3

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

解决方案

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

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

var getModel = function(type) {
    var map = { 'one': M1, 'two': M2 };
    return new map[type];
};
然后您可以使用它来获取适当类型模型的新实例:

var model = getModel('two');

在这个工厂函数中包装新的操作员怎么样

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
编辑 您还可以将factory方法与当前的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

我将使用以下命令:不需要在getModel函数的外部添加新的命令,我将把它放在内部(返回新的map[type])。然后使用getModel('two')获取model instacne。@Evgeny我可以使用map,但我想了解错误的原因?@Evgeny感谢您的回复。我现在明白了这个问题,我试着用一些词来解释它。如果您认为有更好的解释,请随意编辑答案。也许可以将
new
移动到
getModel
中,并将其称为工厂?这将消除所有的混乱(可能重命名为
createModel
)。@Prinzhorn这是一个非常好的建议。为什么我不这么认为。您很好。@Prinzhorn如果您对您所说的内容进行补充,我很乐意接受您的回答:)我刚刚意识到Evgeny在上面的评论中已经提出了这一点。@Prinzhorn谢谢)如果您不介意的话,我将把这个想法作为替代方案发布solution@Prinzhorn是的。你还打算创建一个模型工厂。你刚刚错过了“工厂”这个词,它在这里很重要;)很高兴接受您的解决方案:)
var model = new (getModel('two'))();
var getModel = function(type) {
    var map = { 'one': M1, 'two': M2 };
    return new map[type];
};
var model = getModel('two');
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
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