【问题标题】:optional initialisation properties for new Javascript object新 Javascript 对象的可选初始化属性
【发布时间】:2012-07-29 02:27:55
【问题描述】:

这是使用默认属性创建 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"  */

【问题讨论】:

    标签: javascript oop object arguments default


    【解决方案1】:

    为避免重复自己,您可以构建一个您期望的键列表以及如果未指定要插入的默认值:

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

    【讨论】:

    • 我已经接受了上述答案,但将for in 语句重写为:/* Evaluate initialisation data */ for(var key in this.defaults) { this[key] = (data !== undefined && data[key] !== undefined) ? data[key] : this.defaults[key]; }
    • 应该是:for(var key in keys) { this[key] = (data !== undefined && data[key] !== undefined) ? data[key] : keys[key]; } where keys = this.keys
    • 这在功能上没有什么不同,可以说更糟,因为你应该在那里检查 hasOwnProperty。
    【解决方案2】:

    我不会那样做。我会做的

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

    您会注意到我假设您关心显式类型,即当您分配null 时,您需要null,而不是undefined"" 也一样。

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

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

    【讨论】:

    • 这会起作用,但有没有办法避免多次输入“.PersonID”、“.Name_Last”、..等?我问的原因是因为我有一个 mysql 表、PHP 类、Json 键和这个 Person 类都使用相同的属性名称,但我想限制我需要输入它的次数。否则,我喜欢你的建议
    猜你喜欢
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    相关资源
    最近更新 更多