我正在尝试使用标准对象模式使用javascript创建SDK。除非我想动态配置结果对象之一,例如如果其演示使用简单的RNG,则为演示,如果其为真实游戏,则使用HW RNG(不同的RNG实现)。以下无效:
sdk.js
var Sdk = (function () {
var rng;
var localRng = (function() {
var getInt = function(min, max) { // min and max included
return Math.floor(Math.random() * (max - min + 1) + min);
}
return {
getInt: getInt
}
})();
var init = function(demo=true) {
if (demo ) {
console.log("initiing sdk as demo");
rng = localRng;
} else {
console.log("ALERT, REAL not implemented")
}
};
return {
init:init,
rng:rng,
}
})();
main.js
sdk.init(true);
var start = sdk.rng.getInt(1,12);
问题在于sdk.rng未定义。
如果我这样硬编码:
var rng = (function() {
var getInt = function(min, max) { // min and max included
return Math.floor(Math.random() * (max - min + 1) + min);
}
return {
getInt: getInt
}
})();
在上面是有效的。
问题的关键在于您可以在演示模式或实模式下玩游戏,因此必须能够切换SDK在后台进行填充的方式(即,它使用哪个对象,一个演示或真实对象)。显然,在实数sdk和实数rng中,有很多功能,包括私有和公共功能(返回)
任何帮助表示赞赏。
答案 0 :(得分:4)
这样做的时候
init
您将返回一个对象,该对象的init
属性指向rng
的当前引用(该函数),并且其rng
属性指向{{ 1}}(即undefined
)。听起来您想动态地 返回对局部变量rng
的引用,这可以通过将返回对象的rng
属性设置为 getter来完成。 返回该局部变量:
return {
init:init,
get rng() {
return rng;
}
}
var sdk = (function () {
var rng;
var localRng = (function() {
var getInt = function(min, max) { // min and max included
return Math.floor(Math.random() * (max - min + 1) + min);
}
return {
getInt: getInt
}
})();
var init = function(demo=true) {
if (demo ) {
console.log("initiing sdk as demo");
rng = localRng;
} else {
console.log("ALERT, REAL not implemented")
}
};
return {
init:init,
get rng(){
return rng;
}
}
})();
sdk.init(true);
var start = sdk.rng.getInt(1,12);
console.log(start);
不过,您可以考虑只保存对返回对象的引用,并在调用init
时为其分配属性,而不是重新分配该变量:
var sdk = (function () {
var rng;
var localRng = (function() {
var getInt = function(min, max) { // min and max included
return Math.floor(Math.random() * (max - min + 1) + min);
}
return {
getInt: getInt
}
})();
var init = function(demo=true) {
if (demo ) {
console.log("initiing sdk as demo");
returnedObj.rng = localRng;
} else {
console.log("ALERT, REAL not implemented")
}
};
const returnedObj = { init };
return returnedObj;
})();
sdk.init(true);
var start = sdk.rng.getInt(1,12);
console.log(start);