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

optional initialisation properties for new Javascript object

本文关键字:初始化 属性 Javascript 对象      更新时间:2024-04-02

这是制作一个具有默认属性(即使这里有些属性为null)的javascript类的正确方法吗?同时还具有选项来添加一个创建参数,该参数可以包含以对象格式/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"  */

为了避免重复,您可以构建一个您期望的密钥列表,以及如果没有指定要插入的默认值:

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

我不会那样做。我会做

QM.Person=function(data)
{
    data = data || {};
    this.PersonID= data.PersonId || null; 
    this.Name_Last= data.Name_Last || ""; 
    ...
}

你会注意到,我假设你关心显式类型,即当你分配null时,你想要的是null,而不是undefined""也是如此。

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

最后,您想要添加到函数中的所有方法都应该在原型上。属性应该NOT在原型上,除非您希望所有实例共享相同的属性。由于除了数据清理器之外没有其他方法,所以您所展示的任何东西都不应该出现在原型上。