Javascript 骨干实体
我是新手。但当我研究模型实体时,我不了解一些事情。如果我们可以用java或C#等标准语言定义模型属性,那就太好了。有可能是这样的吗。所以我的想法是这样的:Javascript 骨干实体,javascript,backbone.js,Javascript,Backbone.js,我是新手。但当我研究模型实体时,我不了解一些事情。如果我们可以用java或C#等标准语言定义模型属性,那就太好了。有可能是这样的吗。所以我的想法是这样的: MyEntity=Backbone.Model.extend({ //在这里定义类属性 默认值:{ 名称:空, 姓:空 } }); var entity=new MyEntity(); //我的想法是: name=entity.get('name');//返回空 test=entity.get('test');//这将引发异常,因为测试属性
MyEntity=Backbone.Model.extend({
//在这里定义类属性
默认值:{
名称:空,
姓:空
}
});
var entity=new MyEntity();
//我的想法是:
name=entity.get('name');//返回空
test=entity.get('test');//这将引发异常,因为测试属性不存在
exist=实体。has('name');//应该返回true。属性存在,但为空
entity.set('test2','hello');//这应该引发异常,属性test2不存在
//现实:
name=entity.get('name');//返回空
test=entity.get('test');//返回未定义
exist=实体。has('name');//返回错误
entity.set('test2','hello');//好的,您可以设置自己的自定义getter和setter
var MyEntity = Backbone.Model.extend({
defaults: {
name: null,
surname: null
},
customHas: function (key) {
return this.attributes.hasOwnProperty(key);
},
customGet: function (key) {
if (this.customHas(key)) {
return this.get(key);
} else {
throw('property does not exist');
}
},
customSet: function (key, val) {
if (this.customHas(key)) {
this.set(key, val);
} else {
throw('property does not exist');
}
}
});
.这不是语言特性,而是主干的实现方式。基本上,主干是一个主干,而不是一个框架,这意味着,您可以扩展它并在上面编写您的逻辑
可能是这样的:
var AbstractModel=Backbone.Model.extend({
get:function(){
var value=Backbone.Model.get.apply(这是参数);
if(typeof值==“未定义”){
抛出新错误(“未定义”);
}
返回值;
},
has:函数(attr){
返回attr的类型!=“未定义”;
}
});
如果您想要一个更为固执己见的主干网版本,以及模式验证等,请看一看其他框架,例如,我将使用getter和setter定义一个特定的原型,并且只使用getter和setter来操作实例
var MyEntity = function(name, surname) {
Backbone.Model.call(this);
this.set({"name": name, "surname": surname});
};
MyEntity.prototype = Object.create(Backbone.Model.prototype);
MyEntity.prototype.constructor = MyEntity;
_.extend(MyEntity.prototype, {
getName: function() {
return this.get("name");
},
setName: function(name) {
return this.set({"name":name});
},
getSurname: function() {
return this.get("surname");
},
setSurname: function(name) {
return this.set({"surname":name});
}
});
如果这对您来说工作量太大,您可以编写一个函数,从定义对象生成原型,例如:
function generatePrototype(properties) {
var module = function() {
Backbone.Model.call(this);
var values = {};
for(var i = 0, l = properties.length ; i < l ; i++) {
values[properties[i]] = arguments[i];
}
this.set(values);
};
module.prototype = Object.create(Backbone.Model.prototype);
module.prototype.constructor = module;
_.each(properties, function(property) {
var propertyCap = property.charAt(0).toUpperCase() + property.slice(1);
module.prototype["get" + propertyCap] = function() {
return this.get(property);
},
module.prototype["set" + propertyCap] = function(value) {
var values = {};
values[property] = value;
return this.set(values);
}
});
return module;
}
两种解决方案齐头并进:谢谢你,亚当。但是我喜欢用“get”和“set”来表示getter和setter。那么我可以重写这些方法吗?谢谢如果你真的想这么做,但更复杂。在几个不同的位置,因此您必须使用try/catch(举几个例子,isNew()
,where()
,以及Model
构造函数)重做更多的方法。另外,任何查看您的代码并参考主干文档的人都会感到非常困惑!
var MyEntity = generatePrototype(["name", "surname"]);