使用Revealing Prototype Pattern时出现“未定义不是函数”错误

时间:2015-04-06 20:12:35

标签: javascript jquery revealing-prototype

我试图在JavaScript文件中使用Revealing Prototype Pattern来封装两个相关函数集合。但是当页面加载时,它会在调用.init函数时返回以下错误:

"未捕获的TypeError:未定义不是函数。"

这是我的标记模式。

<script>
    $(function () {
        testProto1.init();
        testProto2.init();
    });
</script>

这是我的JavaScript文件中的模式。

var testProto1 = function () {

};

testProto1.prototype = function () {
    var init = function () {
        alert("init 1");
    };

    return {
        init: init
    }
}();


var testProto2 = function () {

};

testProto2.prototype = function () {
    var init = function () {
        alert("init 2");
    };

    return {
        init: init
    }
}();

这可能是我的一些基本语法错误,如果它是重复的,我会道歉。为什么我会看到此错误,如何解决?感谢。

2 个答案:

答案 0 :(得分:3)

看起来你正在使用原型和放大器的概念。函数实例在很多方面都不正确。

如果您希望能够访问原型,则需要使用instantiate运算符new函数。

看起来你正试图实现这个目标:

var testProto1 = function () { };

// Create your methods in object notation within your prototype
testProto1.prototype.init = function () { 
    alert('init called');
};

现在,如果你想打电话给它,你必须instantiate它!

var proto1 = new testProto1();

// NOW you can call .init! Because the prototype was actually created

proto1.init(); // alerts 'init called!'

答案 1 :(得分:1)

您可以从此Object的实例访问原型属性,因此这将起作用:

var a=new testProto1();
a.init();

如果你想从testProto1访问init函数,你必须写:

testProto1.prototype.init();

所以你的代码看起来像是:

    $(function () {
    testProto1.prototype.init();
    testProto2.prototype.init();
});