生成器模式应如何处理未定义的可选项

How should the Builder Pattern handle undefined optionals?

本文关键字:处理 未定义 可选项 何处理 模式      更新时间:2023-09-26

我正在用JavaScript构造一个生成器,我不确定构建器通常如何处理可选的未定义值。我想如果字段未定义,生成器不会将可选字段附加到对象。这对建筑商来说是可以接受的吗?如果没有,还有什么替代方案?

下面是构建器不附加未定义的可选的第一个实现的示例:

建筑工人:

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"
// };
//

提前感谢!

我认为您在_withOptinalParam函数中丢失了this的上下文。你可以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>