JavaScript 类型错误,不是一个函数。

6

我遇到了一个有点奇怪的问题,似乎无法解决!这是我正在编写的一个大型框架的一部分,但我编写了一些测试代码,也遇到了同样的问题。请看下面的代码:

!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查看了返回的对象,它只有选择器元素,这很合理,因为我没有使用原型。我该怎么解决呢?

将test.fn更改为test.prototype或test.fn.prototype。 - jasssonpet
我已经添加了“test.fn.prototype = test.fn”,但它仍然不起作用,完全相同的错误 :( - jleck
你必须将弹出窗口分配给test.fn.init的原型。 - Felix Kling
2个回答

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;

您错过了在test的实例中创建构造函数和原型链。

实际上还有一件事,这种情况下 "constructor: test" 是什么意思? - jleck
其实不用了,我已经解决了。如果你使用"new test()"语句,它会将原始test函数作为构造函数。唉! - jleck
返回创建实例原型的函数的引用。如果不需要,可以将其从Object更改为test并删除它。 - jasssonpet

0
在我的情况下,出现错误是在添加集成测试时。我没有注意到我试图调用的函数属于一个模拟类。很容易混淆,因为当尝试导航(我正在使用IntelliJ)时,IDE会进入实现的函数。
模拟错误中提到的函数可以解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接