使用对象文本和默认值创建javascript类的最佳方法

使用对象文本和默认值创建javascript类的最佳方法,javascript,object,Javascript,Object,创建javascript类的最佳方法是什么,这样就可以通过传入对象文本来创建对象,同时维护类中设置的默认值 var brett = new Person({ name: 'Brett' ,age: 21 //gender: 'male' //The default is female, so brett.gender will be female }); 可能通过如下方式定义构造函数: function Person(props) { this.name = p

创建javascript类的最佳方法是什么,这样就可以通过传入对象文本来创建对象,同时维护类中设置的默认值

var brett = new Person({
    name: 'Brett'
    ,age: 21
    //gender: 'male' //The default is female, so brett.gender will be female
});

可能通过如下方式定义构造函数:

function Person(props) {
    this.name = props.name;
    this.age = props.age;
    this.gender = props.gender || 'female';
}
。。。虽然如果您曾经想要传递错误的性别(例如,
'
0
false
null
未定义的
),默认值仍将使用。如果这是一个问题,您可以执行以下操作:

function Person(props) {
    // expected properties
    this.name = props.name;
    this.age = props.age;

    // optional properties
    var defaults = {
        gender: 'female'
        // etc
    };
    for (var k in defaults) {
        this[k] = props.hasOwnProperty(k) ? props[k] : defaults[k];
    }
}

可能通过如下方式定义构造函数:

function Person(props) {
    this.name = props.name;
    this.age = props.age;
    this.gender = props.gender || 'female';
}
。。。虽然如果您曾经想要传递错误的性别(例如,
'
0
false
null
未定义的
),默认值仍将使用。如果这是一个问题,您可以执行以下操作:

function Person(props) {
    // expected properties
    this.name = props.name;
    this.age = props.age;

    // optional properties
    var defaults = {
        gender: 'female'
        // etc
    };
    for (var k in defaults) {
        this[k] = props.hasOwnProperty(k) ? props[k] : defaults[k];
    }
}

您可以进行浅层克隆:

function shallow_clone(target, source) {
    for (var i in source) {
        if (typeof target[i] == "undefined") {
            target[i] = source[i];
        }
     }
};
然后:

function Person(opts) {
    var defaults = { gender: 'male' }; 

    shallow_clone(this, opts);
    shallow_clone(this, defaults);
    ....
};

如果您需要选项的深层副本,您可以制作一个深层克隆()(显然更复杂)。

您可以制作一个浅层克隆:

function shallow_clone(target, source) {
    for (var i in source) {
        if (typeof target[i] == "undefined") {
            target[i] = source[i];
        }
     }
};
然后:

function Person(opts) {
    var defaults = { gender: 'male' }; 

    shallow_clone(this, opts);
    shallow_clone(this, defaults);
    ....
};

如果您需要更深层的选项副本,您可以制作一个深层克隆()(显然更复杂)。

您也可以使用jQuery的
$.extend()
您也可以使用jQuery的
$.extend()
谢谢!我不知道这个存在。我正在使用jquery,所以这将非常有用。谢谢!我不知道这个存在。无论如何,我都在使用jquery,所以这将非常有用。