JavaScript简单对象继承

时间:2013-05-24 12:54:39

标签: javascript

我们正在使用一个以对象作为参数的小部件。我想要一些对象继承之王来自定义小部件。默认设置应该是默认设置然后继承对象(添加和更新属性),它应该提供所需的对象,如下面的代码所示。

defaultSettings = {

     setting1 = "setting1 value"; 
     setting2 = "setting2 value"; 

}

customSettings  = {

     setting2 = "setting2 value - custom";  //Overwrite defaultSettings 2    
     setting3 = "setting3 value";  //New Setting 

}

finalObject = {

    setting1 = "setting2 value - custom"; 
    setting2 = "setting2 value"; 
    setting3 = "setting2 value"; 
} 

我在问这个之前已经用Google搜索了但不确定这是实现这一目标的最有效技巧吗?

3 个答案:

答案 0 :(得分:2)

继承通常不是你所描述的方式。相反,你通常做的是有一个默认对象:

var defaults = {
   setting1: "default1",
   setting2: "default2",
   setting3: "default3"
};

...然后让函数接受一个可能具有任何属性(或没有它们)的对象,然后构建一个组合结果,如下所示:

function apiCall(o) {
    var options = {};
    var key;

    for (key in defaults) {
        options[key] = defaults[key];
    }
    for (key in o) {
        options[key] = o[key];
    }

    // ...then use `options` here...
}

这是一种常见的模式,许多库都有它的功能,例如jQuery's extendPrototype's extend等。

接受任意数量对象的通用extend(每个对象优先于前一个对象)如下所示:

function extend() {
    var rv = {},
        key,
        source,
        index;

    for (index = 0; index < arguments.length; ++index) {
        source = arguments[index];
        for (key in source) {
            rv[key] = source[key];
        }
    }

    return rv;
}

如果您有extend,那么API调用函数就是这样:

function apiCall(options) {
    options = extend(defaults, options);

    // ...
}

但如果您 对JavaScript中的继承感兴趣,我创建了helper library called Lineage以便更轻松,write about JavaScript(包括继承)anemic little my blog周期性。

答案 1 :(得分:0)

如果您使用的是Node.js,则可以使用util.inherits(constructor, superConstructor)。 如果不是,这里有一些依赖于库的文档:

实施可能有所不同(例如深层复制),因此我建议您在将其标记为生产之前对其进行彻底测试。

答案 2 :(得分:0)

您可以在类中设置默认值,如果传递值,则该类将采用这些值。

var foo = function (settings){
    this.Settings = settings || {};

    this.Settings.a = this.Settings.a  || 'Default';
    this.Settings.b = this.Settings.b  || 'Default'
    console.log(this.Settings)
}

//default
var test = new foo(); //Object {a: "default", b: "default"}

//custom
var settings = {
    a:'a', 
    b:'b'
};
var x = new foo(settings); // Object {a: "a", b: "b"}


//add new settings
x.Settings.c = 'test';

console.log(x.Settings); // Object {a: "a", b: "b", c: "test"}