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

09-27 13:35