JavaScript中的动态实例化[Classname as String]

时间:2016-03-24 15:38:36

标签: javascript dynamic sapui5

我正在使用JSON格式的Javascript和Appdescriptors。 我想要做的是创建一个Class的实例,其中classname在// not leap year中保存为字符串。如果不是这种情况,我想采取oModelConf[sModelName].type

Related Question提供了这个解决方案:

"sap.ui.model.odata.ODataModel"

我认为这不是一个很好的解决方案。

编辑它对我不起作用,因为我的类未在窗口中定义,因此function instantiate(className, args) { var o, f, c; c = window[className]; // get reference to class constructor function f = function(){}; // dummy function f.prototype = c.prototype; // reference same prototype o = new f(); // instantiate dummy function to copy prototype properties c.apply(o, args); // call class constructor, supplying new object as context o.constructor = c; // assign correct constructor (not f) return o; } 未定义。我不知道在SAPUI5中我的功能定义在哪里

第二个解决方案:

window[className]

这不是更好的解决方案,因为我们不应该使用eval(`a = new ${oModelConf[sModelName].type || "sap.ui.model.odata.ODataModel"}(sServiceUrl, true);`);

有更好的解决方案吗?

EDIT2 由于the url in pimskies answer我找到了另一个解决方案:

由于eval()window.sap.ui.model.odata.ODataModel相同,sap.ui.model.odata.ODataModelwindow.sap相同 我可以接受我的字符串,并将所有window[sap]替换为.,将右括号放在前面和后面。

我不会编写代码,因为它不是一个解决方案。(我不应该编写][的东西......)

3 个答案:

答案 0 :(得分:3)

您可以使用jQuery.sap.getObject访问该课程:

20px

编辑:另一种方式(如果您使用AMD,我会推荐)

如果您使用的是现代AMD modules并且您不知道是否已加载包含您的类的模块,则应使用sap.ui.require()异步加载模块。它需要通过unified resource name指定模块(转换可能是最难看的部分):

var ModelClass = jQuery.sap.getObject(oModelConf[sModelName].type || "sap.ui.model.odata.ODataModel");
var model = new ModelClass();

答案 1 :(得分:0)

也许将字符串映射到一个类?

function Foo() {
  console.log('new foo');
}

function Bar() {
  console.log('new bar');
}

var objects = {
    'foo': Foo,
  'bar': Bar
};

var cls = objects.foo || Bar;

new cls();

https://jsfiddle.net/ckd56d9v/1/

或者看看这个答案:https://stackoverflow.com/a/9804142/5930258

答案 2 :(得分:0)

两者结合在一起的是什么?由于window[className]失败,请将其替换为 oModelConf[className].type || sap.ui.model.odata.ODataModel ...

function instantiate(className, args) {
    var o, f, c;
    c = oModelConf[className] || sap.ui.model.odata.ODataModel;
    f = function(){}; // dummy function
    f.prototype = c.prototype; // reference same prototype
    o = new f(); // instantiate dummy function to copy prototype properties
    c.apply(o, args); // call class constructor, supplying new object as context
    o.constructor = c; // assign correct constructor (not f)
    return o;
}