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

问题描述 投票:0回答:1

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

感谢任何帮助。

javascript
1个回答
0
投票

执行时

return {
    init:init,
    rng:rng,
}

您将返回一个对象,该对象的init属性指向init的当前引用(该函数),并且其rng属性指向rng的当前引用(即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);
© www.soinside.com 2019 - 2024. All rights reserved.