2

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

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"; 
} 

在问这个问题之前我已经用谷歌搜索过,但不确定这是实现这一目标的最有效技术吗?

4

3 回答 3

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'sextendPrototype'sextend等。

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 中的继承感兴趣,我创建了一个帮助程序库Lineage以使其更容易,并且我会定期在我的博客上写关于 JavaScript(包括继承)的文章。

于 2013-05-24T12:59:25.937 回答
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"}
于 2013-05-24T13:14:49.927 回答
0

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

实现可能会有所不同(例如深拷贝),因此我建议您在将其标记为可用于生产之前对其进行彻底测试。

于 2013-05-24T12:59:03.983 回答