我想基于某个参数创建一个新模型。 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'));
我尝试了几种符号,但无法确定原因。
var mapModel = {
'one': M1,
'two': M2
};
new mapModel['two']();
var model = new (getModel('two')());
var model = (new getModel('two'))();
我不明白什么是不义之物以及为什么我会看到这个错误。
答案 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