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 */
ここでは、Section の新しいインスタンスを初期化し、便利なメソッドを使用してその値を埋めるためだけに DSL を使用します。自分の DSL オブジェクトを破棄したいのですが、そのメンバーの 1 つをさらに使用するとどうなるかわかりません。
たぶん、dsl.sectionをnullに設定するか、「delete dsl.section」を使用して削除する「dispose」メソッドを作成する必要がありますか?その後、私のセクションは DSL から切断され、ガベージ コレクターによって正常に削除され、新しい参照 "mySection" を介して引き続き使用されます。
別のアイデアがあります:
DSL をシングルトンとして使用する可能性があります。その場合、ビルダー関数を呼び出す前に、「セクション」メソッド内に新しいセクション オブジェクトを作成し、それを 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;
}