我们正在使用一个以对象作为参数的小部件。我想要一些对象继承之王来自定义小部件。默认设置应该是默认设置然后继承对象(添加和更新属性),它应该提供所需的对象,如下面的代码所示。
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搜索了但不确定这是实现这一目标的最有效技巧吗?
答案 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 extend
,Prototype'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"}