Javascript域模型对象的约定

时间:2009-02-13 16:34:51

标签: javascript design-patterns domain-driven-design

如果我必须在C#中创建一个域模型对象,我可能会这样做:

public class Person
{
    Public string Name { get; set; }
    Public string Gender { get; set; }
    Public int Age { get; set; }
}

在Javascript中,定义这些对象的惯例是什么?我在想这样的事情:

NAMESPACE.Person = function() {
    this.name = "";
    this.gender = "";
    this.age = 0;
}

2 个答案:

答案 0 :(得分:3)

是的,基本上可以看到。唯一要补充的是你应该原型方法。你如何将原型设计为设计,我通常更愿意在内部对类进行此操作,但标记为只在需要时才运行,并且只运行一次。

NAMESPACE.Person = function() {
    this.name = "";
    this.gender = "";
    this.age = 0;

    if(!NAMESPACE.Person._prototyped)
    {
        NAMESPACE.Person.prototype.MethodA = function () {};
        NAMESPACE.Person.prototype.MethodB = function () {};
        NAMESPACE.Person.prototype.MethodC = function () {};

        NAMESPACE.Person._prototyped = true; 
    }
}

解释原因:原因是性能和继承。原型属性直接与类(函数)对象相关联,而不是与实例相关联,因此它们可以单独从函数引用遍历。因为它们在类中,所以只需要存在一个对象,而不是每个实例一个。

答案 1 :(得分:0)

我认为没有太多的“惯例”,但你可以声明“私人”变量,Crockford会告诉你如何here


function Constructor(...) { var that =
this; var membername = value; function
membername(...) {...}

}
     

注意:函数语句


function membername(...) {...}
     

的简写

var membername = function
membername(...) {...};

为了完善答案,你会这样做,你会注意到我做的有点不同


// class
function Person()
{
    // private variable
    var name = "Default Value";

    // getter
    this.getName = function()
    {
        return name;
    }

    // setter
    this.setName = function(s)
    {
        name = s;
    }
}


// instanciate an object
var p = new Person();

// alerts: Default Value
alert(p.getName());

p.setName("def");

// alerts: def
alert(p.getName());

// alerts: undefined
alert(p.name);