javascript:如何从对象动态返回函数

javascript:如何从对象动态返回函数,javascript,Javascript,我正在尝试使用javascript创建一个SDK,使用标准对象模式。它工作得很好,除非我想动态配置一个结果对象,例如,如果它的演示使用一个简单的RNG,如果它是一个真实的游戏,使用一个HW RNG不同的RNG实现。以下内容不起作用: sdk.js var Sdk = (function () { var rng; var localRng = (function() { var getInt = function(min, max) { // min and ma

我正在尝试使用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中,有更多的函数,包括私有函数和公共函数

感谢您的帮助。

如果您愿意

return {
    init:init,
    rng:rng,
}
您正在返回一个对象,其init属性指向函数init的当前引用,而其rng属性指向未定义的rng的当前引用。听起来您希望动态返回对局部变量rng的引用,这可以通过将返回对象的rng属性设置为返回该局部变量的getter来实现:

return {
    init:init,
    get rng() {
      return rng;
    }
}
var sdk=函数{ var-rng; var localRng=函数{ var getInt=functionmin,max{//min和max包括在内 返回Math.floorMath.random*max-min+1+min; } 返回{ getInt:getInt } }; var init=functiondemo=true{ 如果演示{ console.loginiting sdk作为演示; rng=localRng; }否则{ console.logALERT,未实现REAL } }; 返回{ init:init, 获取rng{ 返回rng; } } }; sdk.inittrue; var start=sdk.rng.getInt1,12;
console.logstart;你的第一个解决方案很有效。我从来没有想到get关键字在这里起作用,或者您不需要像sdk.rng.get.getInt1,12这样的东西。