Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 骨干实体_Javascript_Backbone.js - Fatal编程技术网

Javascript 骨干实体

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');//这将引发异常,因为测试属性

我是新手。但当我研究模型实体时,我不了解一些事情。如果我们可以用java或C#等标准语言定义模型属性,那就太好了。有可能是这样的吗。所以我的想法是这样的:

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"]);