0

我正在用 JavaScript 构建一个构建器,但我不确定构建器通常如何处理选项的未定义值。如果字段未定义,我想认为 Builder 不会将可选字段附加到对象。Builder可以接受吗?如果没有,还有什么替代方案?

这是第一个实现的示例,其中构建器不附加未定义的可选项:

生成器:

function Thing(required1, required2, required3) {
 //check required params 

  var fields = {
    required1: required1, 
    required2: required2, 
    required3: required3
  };  

  var _withOptionalParam = function(param) {
    if(!param) { return this; } //exit function early if param is undefined

    fields.param = param; 
    return this; 
  };

  var _build = function() {
    var result = fields;
    return result;
  };

  var builder = {
    withOptionalParam: _withOptionalParam,
    build: _build
  };

  return builder;
}

在行动:

var thing = new Thing("foo","bar","baz").withOptionalParam(undefined).build();

//'thing' should be 
// { 
//  required1:"foo", 
//  required2:"bar", 
//  required3:"baz"
// };
//

提前致谢!

4

1 回答 1

0

this我认为您正在失去_withOptinalParam功能中的上下文。你可以bind反对fields它作为this上下文。

function Thing(required1, required2, required3) {
 //check required params 

  var fields = {
    required1: required1, 
    required2: required2, 
    required3: required3
  };  

  var _withOptionalParam = function(param) {
    if(!param) { return this; } //exit function early if param is undefined

    fields.param = param; 
    return this; 
  };

  var _build = function() {
    var result = fields;
    return result;
  };

  var builder = {
    withOptionalParam: _withOptionalParam.bind(fields),
    build: _build
  };

  return builder;
}

var thing = new Thing("foo","bar","baz").withOptionalParam(undefined);

console.log( thing );

//'thing' should be 
// { 
//  required1:"foo", 
//  required2:"bar", 
//  required3:"baz"
// };
//
<script src="http://codepen.io/synthet1c/pen/WrQapG.js"></script>

于 2016-01-14T22:26:40.450 回答