如何覆盖对象变量

时间:2019-02-18 10:09:53

标签: javascript

我想使用类似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

对于每个可能的可重写变量,只需简单地以某种方式使用变量名称即可。

4 个答案:

答案 0 :(得分:6)

您可以使用默认属性值将config分解为var1var2var3变量。如果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();