将默认值与用户定义的设置合并

时间:2016-06-27 01:21:06

标签: javascript class

我正在尝试使用设置创建插件。将有默认设置和用户定义的设置。我将不得不以object的方式将两者合并。我尝试了以下方法:

JSFiddle

function MyPlugin(options) {
  if (typeof optoins === null || typeof options !== 'object') options = {};

  var defaults = {
      prop1: true,
      prop2: false,
      prop3: 0,
      prop4: 100,
    }
    // Set default options
  for (var name in defaults) {
    !(name in options) && (this.options[name] = defaults[name]);
  }
}
var test = new MyPlugin();

但是我收到一个错误说:

  

未捕获的TypeError:无法设置未定义的属性'prop1'

我做错了什么,我该如何解决?

1 个答案:

答案 0 :(得分:0)

我想你可能会看到这样的事情。

function MyPlugin(options) {
    options = options || {};

    if (typeof userOpt !== 'object') {
        options = {};
    }

    var defaults = {
        prop1: true,
        prop2: false,
        prop3: 0,
        prop4: 100
    };

    // Set default options
    for (var name in defaults) {
        defaults[name] = options.hasOwnProperty(name) ? options[name] : defaults[name];
    }
}

MyPlugin({
    prop1: false,
    prop4: 300
});

因此,如果使用MyPlugin()调用null,那么userOpt将是一个空对象{}。

<强>输出

{"prop1":false, "prop2":false, "prop3":0, "prop4":300}

.hasOwnProperty只是检查是否已由用户设置,如果是,则使用用户的选项,否则执行默认设置。

hasOwnProperty https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

  

来自Object的每个对象都继承hasOwnProperty方法。    此方法可用于确定对象是否具有   指定属性作为该对象的直接属性 ;与in不同   运算符,此方法不会检查对象的原型   链