我想使用JavaScript中的闭包实现构建器。我觉得可以做到,但是很难将其放入代码中。
我有类似的东西,但我觉得可能有一个更好的解决方案,可以利用部分应用程序之类的东西。
function Builder() {
this.spec = {};
}
Builder.prototype.withFoo = function(value) {
this.spec.foo = value;
return this;
};
Builder.prototype.withBar = function(value) {
this.spec.bar = value;
return this;
};
Builder.prototype.build = function() {
var result = {};
result.foo = this.spec.foo;
result.bar = this.spec.bar;
this.spec = {}; // This is to avoid accidentally using the same builder repeatedly.
return result;
};
var builder = new Builder();
builder.withFoo('foo value')
.withBar('foo value')
.build(); // { foo: 'foo value' , bar: 'bar value' }
有人可以帮我吗?
编辑:这里的关键是我希望延迟地实例化该对象。
最佳答案
这是另一种方法:
function Builder(obj){
return obj;
}
Fowler和Martin将此称为“身份生成器”,在企业体系结构中很常见。它具有支持对象和子对象的任意嵌套层次结构的优点,并且是完全通用的。
var myBuildObject = Builder({
spec: {
foo: foo,
bar: bar
}
});
尽管它做得更多,但它也可以轻松地指定数组:
var myBuildObject = Builder({
spec: [....]
});
可以使用更复杂的构建器对其进行扩展和子类化,这些构建器可以在装饰它之后依次执行
return Builder.call(this, obj)
。它甚至可以指定getter / setter。