如何使用Javascript创建动态对象?

时间:2014-07-19 08:17:03

标签: javascript jquery

我正在使用Javacript(使用jQuery)为我的用户界面创建一个Manager对象。一般的想法是捕获所有可点击的元素(使用.clickable类定义),然后根据元素的id创建相应的对象来处理所需的操作。

这是我的经理对象定义:

function Manager() {

    this.init = function() {
        $('.clickable').click( function() {
            var l = this.id.split("_");
            var controller = Manager.ucfirst(l[0]) + "()";
            var action = l[1];
            var nclass = new controler;
        });
    };

    this.init();
}

当用户点击像

这样的可点击元素时
<a id="user_login" class="clickable">Login</a>

然后这个管理器应该创建一个对象User(id的第一部分用大写的第一个字母),然后执行方法login(id的第二部分)。

但事实上,当我点击元素时,我会收到一个&#34;未捕获的TypeError:字符串不是函数&#34;。

嗯,我知道字符串不是函数!但我假设Javascript非常聪明,可以在PHP中使用类似$$变量的东西。

我做过一些研究但没有实际结果。请有人帮帮我吗?

2 个答案:

答案 0 :(得分:1)

当您运行此代码Manager.ucfirst(l[0]) + "()"时,它将返回一个类似&#34; User()&#34;的字符串。显然,这不是与new关键字一起使用的构造函数。您应该做的是这样的事情(假设User在全球范围内可用):

var controller = window[Manager.ucfirst(l[0])];

在这里按键获取window对象属性。所以controller在这种情况下将是function,一切都应该有效。

答案 1 :(得分:1)

以下是您可以采取的措施:

function Manager() {

    this.init = function() {

        $('.clickable').click( function() {
            var l = this.id.split("_");

            var controller = Manager[l[0][0].toUpperCase() + l[0].substring(1)];
            var action = l[1];

            var nclass = new controler;
        });

    };

    this.init();
 }

关键是你应该为控制器分配一个函数类型,而不是一个看起来像函数调用表达式的字符串。如果被引用的Manager实例定义了一个被命名为Manager[l[0][0].toUpperCase() + l[0].substring(1)]的评估的属性,那么这应该有效。否则,它将失败。

我必须说你的问题背景对我来说不是很清楚,所以我建议采用以下方法来更好,更全面地解决你的问题:

var Manager = ({
    User: function(){ // here's your user constructor
          // ...
    },
    init: function() {

        var self = this;

        $('.clickable').click( function() {
            var l = this.id.split("_");

            var controller, nclass,
                action = l[1],
                controllerName = l[0][0].toUpperCase() + l[0].substring(1);

            if(self[controllerName]){ // checking if it exist cos you never know where the shit that happens all come from.
                controller = self[controllerName]; // returns the constructor
                nclass = new controler; // invokes the constructor
            } else{
                throw new Error("Don't know what to do with unknown controller: '" + controllerName + "'";
            }

        });

        return this; // i.e self
    }
}).init();