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

时间:2019-12-24 22:34:53

标签: javascript

我正在尝试使用标准对象模式使用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中,有很多功能,包括私有和公共功能(返回)

任何帮助表示赞赏。

1 个答案:

答案 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);