我想为我的 javascript 对象创建一个类似 DSL 的构建器,但我不确定垃圾收集器(创建的对象)是否删除了 DSL-Builder 对象。这是代码:
function Section() {...}
Section.DSL = function() {
var section = new Section();
return {
title: function(s) { section.title = s; }, /* Just for example */
content: function(s) { section.content = s; }, /* Logic has been removed */
section: section
}
}
function section(builderFn) {
var dsl = new Section.DSL();
fn.call(dsl, dsl);
return dsl.section;
}
/* Somewhere in the code */
var mySection = section(function(s) {
s.title('Hello, my section');
s.content('We can put it in later');
});
/* I want my DSL object created internally by section method
to be removed by garbage collector */
我将仅使用 DSL 来初始化 Section 的新实例并使用方便的方法填充其值。我希望处理我的 DSL 对象,但我不确定它是否会根据我对其成员之一的进一步使用。
也许我应该创建一个“dispose”方法,它将 dsl.section 设置为 null 或使用“delete dsl.section”将其删除?之后,我的部分将与 DSL 断开连接,垃圾收集器将成功删除它,我通过新的引用“mySection”继续使用它。
还有一个想法:
有可能将 DSL 用作单例。在这种情况下,我必须在“section”方法中创建一个新的 Section 对象,然后在调用构建器函数之前将其分配给 DSL 对象(这将是一个单例)。这是一个很好的解决方案吗?示例如下:
Section.DSL = {
construct: function(section) {
this.section = section;
return this;
}
/* Builder methods */
}
function section(builderFn) {
var section = new Section();
/* Imagine that DSL is just an object with a few functions
and construct just set its section variable and returns this
*/
var dsl = Section.DSL(section); **/
fn.call(dsl, dsl);
return section;
}