我想使用类似JQuery .ajax(..)的语法来配置Javascript对象,并且不使用参数列表,而只定义与默认值不同的值。
到目前为止,我这样写:
function ObjFn(config) {
var var1 = 200
var var2 = "qwerty"
var var3 = 555
if (config instanceof Object){
console.log("-> config")
if (config.var1 !== undefined) var1 = config.var1
if (config.var2 !== undefined) var2 = config.var2
if (config.var3 !== undefined) var3 = config.var3
}
this.describe = function(){
console.log("var1: "+var1+" - "+"var2: "+var2+" - "+"var3: "+var3+" - "+"config: "+config+"\n")
}
}
但是我想知道是否有可能避免编写条件列表:
if (confing.var !== undefined) var = config.var
对于每个可能的可重写变量,只需简单地以某种方式使用变量名称即可。
答案 0 :(得分:6)
您可以使用默认属性值将config
分解为var1
,var2
和var3
变量。如果config
不是对象,请改用空对象进行分解,以便使用那些默认参数:
function ObjFn(config) {
const { var1=200, var2="querty", var3=555} =
config instanceof Object
? config
: {};
this.describe = function(){
console.log("var1: "+var1+" - "+"var2: "+var2+" - "+"var3: "+var3+" - "+"config: "+config+"\n")
}
}
const instance = new ObjFn({ var1: 333 });
instance.describe();
const instance2 = new ObjFn();
instance2.describe();
如果参数(如果传递)将始终是对象,则可以在参数列表中进行销毁:
function ObjFn({ var1=200, var2="querty", var3=555} = {}) {
this.describe = function(){
console.log("var1: "+var1+" - "+"var2: "+var2+" - "+"var3: "+var3)
}
}
const instance = new ObjFn({ var1: 333 });
instance.describe();
const instance2 = new ObjFn();
instance2.describe();
答案 1 :(得分:0)
使用一个对象保存变量,并使用Object.assign()
将配置对象合并为默认值,但这可能会为vars
对象添加新属性:
function ObjFn(config) {
const vars = Object.assign({
var1: 200,
var2: 'qwerty',
var3: 555
}, config);
this.describe = function() {
const str = Object.entries(vars).map(([k, v]) => `${k}: ${v}`).join(' - ');
console.log(str);
}
}
new ObjFn({ var2: 'azerty', newProp: 'hello' }).describe();
new ObjFn({ var1: 1, var3: 0 }).describe();
new ObjFn().describe();
如果您不想添加新属性,请遍历vars
对象的属性,并在存在该条目的情况下从配置中进行设置:
function ObjFn(config) {
const vars = {
var1: 200,
var2: 'qwerty',
var3: 555
};
if (config instanceof Object) {
for (let prop in vars) {
if (config.hasOwnProperty(prop)) {
vars[prop] = config[prop];
}
}
}
this.describe = function() {
const str = Object.entries(vars).map(([k, v]) => `${k}: ${v}`).join(' - ');
console.log(str);
}
}
new ObjFn({ var2: 'azerty', newProp: 'hello' }).describe();
new ObjFn({ var1: 1, var3: 0 }).describe();
new ObjFn().describe();
答案 2 :(得分:0)
这应该有效。简单干净:
function ObjFn(config) {
var var1 = config.var1 || 200
var var2 = config.var2 || "qwerty"
var var3 = config.var3 || 555
this.describe = function(){
console.log("var1: "+var1+" - "+"var2: "+var2+" - "+"var3: "+var3+" - "+"config: "+config+"\n")
}
}
答案 3 :(得分:0)
我将使用一个extend
函数,该函数将一个对象作为它的第一个参数,然后从第一个对象中不存在的所有其他传递的对象中添加属性。这是许多jQuery方法的幕后工作方式(使用jQuery.extend
):
function extend(obj) {
for (var i = 1; i < arguments.length; i++) {
for (var key in arguments[i]) {
if (arguments[i].hasOwnProperty(key)) {
obj[key] = arguments[i][key];
}
}
}
return obj;
}
function ObjFn(config) {
var params = {
var1: 200,
var2: 'qwerty',
var3: 555
};
if (config instanceof Object) {
console.log("-> config");
extend(params, config);
}
this.describe = function () {
console.log("var1: " + params.var1 + " - " + "var2: " + params.var2 + " - " + "var3: " + params.var3 + " - " + "config: " + config + "\n");
}
}
var instance = new ObjFn({var1: 999});
instance.describe();
var instance2 = new ObjFn();
instance2.describe();