Javascript类型错误,不是一个函数

时间:2012-06-19 21:22:23

标签: javascript jquery

我有一个奇怪的问题,我似乎无法解决!它是我正在编写的一个大框架的一部分,但我写了一些具有相同问题的测试代码。请参阅以下内容:

!function ($, window, undefined) {

    // BASE FUNCTION
    var test = function (selector, context) {
        return new test.fn.init(selector, context);
    };

    // SELECTOR FUNCTIONS
    test.fn = {
        selector:   undefined,
        init:       function (selector, context) {
            // Use jQuery to build selector object
            this.selector = $(selector, context);
            return this;
        },

        // Create a popup dialog
        popup:      function (options) {
            this.selector.dialog();
        }
    },

    // Expose Carbon to the global object
    window.test     = test;

}(window.jQuery, window);

现在我使用以下内容:

test('#popupLink').popup();

我得到“TypeError:test(”#popupLink“)。popup不是函数”。我知道它的部分工作,因为我可以使用标准的jQuery函数,如果我这样做:

test('#popupLink').selector.hide();

任何帮助都会非常感激,因为我现在有心理障碍。 提前致谢! :)

更新

我已经使用console.log查看返回的对象,它只有选择器元素,这是有意义的,因为我没有使用原型。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

(function ($, window) {
    // BASE FUNCTION
    var test = function (selector, context) {
        return new test.fn.init(selector, context);
    };

    // SELECTOR FUNCTIONS
    test.fn = test.prototype = {
        constructor: test,
        init: function (selector, context) {
            // Use jQuery to build selector object
            this.selector = $(selector, context);
            return this;
        },

        // Create a popup dialog
        popup: function (options) {
            console.log('popup');
            return this;
        }
    };

    // Expose test to the global object
    window.test = test;
}(window.jQuery, window));

test.fn.init.prototype = test.fn;

您在创建的测试实例上错过了构造函数和原型链。

答案 1 :(得分:0)

就我而言,该错误是在添加集成测试时发生的,并且我没有注意到我尝试调用的函数属于一个模拟类。很容易感到困惑,因为在尝试导航时(我正在使用IntelliJ),IDE会转到已实现的功能。

模拟错误中提到的功能可以解决此问题。