新Javascript对象的可选初始化属性

时间:2012-07-29 02:27:56

标签: javascript oop object arguments default

这是使用默认属性创建javascript类的正确方法吗(即使这里有些属性为null),还有选项添加可以包含某些属性的特定值的创建参数以对象格式/ json列出?

如果我创建了许多Person对象,还应该将其中任何一个放入Person的原型中以节省内存吗?

这对我有用,但我想知道这是否是一个很好的方法呢?

// PERSON Class -----------------------------------------------
 QM.Person=function(data)
 {
    /* Closure for this */
    var my = this;

    this.PersonID=null;
    this.Name_Last="";
    this.Name_First="";
    this.Date_Birth=null;
    this.Biography="";

    this.loadData=function(obj) {
        for (var i in obj) {
            if (my.hasOwnProperty(i)) {
                my[i] = obj[i];
            }
        }
    }

    this.loadData(data);
}

使用此类创建的示例:

jondoe = new Person();

bob = new Person({Name_First:"Bob",Name_Last:"Bar"});

jondoe.Name_First   /*  ""     */
bob.Name_First     /*   "Bob"  */

2 个答案:

答案 0 :(得分:0)

我不这样做。我会做的

QM.Person=function(data)
{
    data = data || {};

    this.PersonID= data.PersonId || null; 
    this.Name_Last= data.Name_Last || ""; 
    ...
}

您会注意到我假设您关注明确类型,即当您指定null时,您需要null,而不是undefined""也是如此。

我认为这比创建一个函数并执行它来清理数据更简单

最后,您要添加到函数中的所有方法都应该在原型上。属性应 NOT 在原型上,除非您希望所有实例共享相同的属性。由于您没有除数据清理器之外的任何方法,因此您所显示的任何方法都不应该用于原型。

答案 1 :(得分:0)

为了避免重复你自己,你可以建立一个你期望的键列表,如果没有指定它们也要插入默认值:

MyType = function(data){
    var keys = this.keys,
        data = data || {},
        key

    for (key in keys) {
        if (keys.hasOwnProperty(key)) {
            if (data.hasOwnProperty(key)) {
                this[key] = data[key];
            } else {
                this[key] = keys[key];
            }
        }
    }      
};

MyType.prototype.keys = {
    personId: null,
    firstName: 'A default first name',
    lastName: ''
};

var o1 = new MyType();
var o2 = new MyType({
    personId: 1,
    firstName: 'Override'
});
console.log(o1, o2);