2015-04-06 44 views
2

我试图在JavaScript文件中使用显示原型模式来封装两个相关函数的集合。但是当页面加载时,它会在调用.init函数时返回以下错误:使用显示原型模式时出现“未定义不是函数”错误

“Uncaught TypeError:Undefined不是函数。”

这是我的标记模式。

<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

请描述你真正想要完成的事情。这段代码看起来有很多不同的方式,但我不确定你实际上想做什么,所以不知道该怎么建议。 'testProto1.init()'不起作用,因为'testProto1'构造函数没有'.init()'属性。 – jfriend00

+0

@ jfriend00,我的意图是命名空间我正在使用的功能。一组函数处理网格,另一组处理数学计算。这种模式不是混合各种功能,而是将功能封装在逻辑单元下。 –

+0

如果你只是想命名一些实际上不是实例化对象的方法的函数,那么你完全不使用原型。您只需将属性放在对象上并调用这些属性即可。 – jfriend00

回答

3

看起来您正在使用原型012的概念函数实例在很多方面都不正确。

如果您希望能够访问原型,则需要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!' 
+0

就是这样。谢谢!我很久以前就在另一家公司使用过这种模式,并且不再拥有该代码。这正是我的问题所在。 –

+0

不是问题,祝你好运! @KenPalmer –

1

你可以从这个对象的实例访问原型的属性,所以这将工作:

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

,如果你想进入电影从testProto1初始化函数,你必须写:

testProto1.prototype.init(); 

因此您的代码将如下所示:

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

谢谢奥马尔。这也起作用。 –

相关问题