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

埃德佩桑皮奥

我正在使用Javacript(使用jQuery)为我的用户界面创建Manager对象。总体思路是捕获所有可点击的元素(使用.clickable类定义),然后根据该元素的ID创建相应的对象以处理所需的操作。

这是我的Manager对象定义:

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的第二部分)。

但是实际上发生的是,当我单击该元素时,我收到一个“未捕获的TypeError:字符串不是函数”。

好吧,我知道字符串不是函数!但是我假设Javascript很聪明,在PHP中有类似$$$ variable的东西。

我做了一些研究,但没有实际结果。有人可以帮我吗?

伊格威·卡卢(Igwe Kalu)

您可以按照以下方式进行操作:

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();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章