Javascript 从模块函数返回原型函数时出现非常奇怪的行为
我正在为一个新网站写一些样板文件,发现自己遇到了一个有趣的问题。我想设置一个模块,返回一个可以扩展的接口。使用原型继承应该使这项任务变得简单,对吗?即使我返回一个函数的新实例,它也是不可扩展的。我有种感觉这是周一早上的混乱Javascript 从模块函数返回原型函数时出现非常奇怪的行为,javascript,design-patterns,Javascript,Design Patterns,我正在为一个新网站写一些样板文件,发现自己遇到了一个有趣的问题。我想设置一个模块,返回一个可以扩展的接口。使用原型继承应该使这项任务变得简单,对吗?即使我返回一个函数的新实例,它也是不可扩展的。我有种感觉这是周一早上的混乱 var someModule = someModule || (function($) { /*Initalize page*/ init(); ///////////////////// // Public Methods // //////////
var someModule = someModule || (function($) {
/*Initalize page*/
init();
/////////////////////
// Public Methods //
/////////////////////
var api = function() {
}
api.prototype.example = function() {
alert("hi!");
}
//////////////////////
// Private Methods //
//////////////////////
function init() {
...
}
return new api();
})(jQuery);
someModule.prototype.newFunct = function()
{
...
}
//Causes an exception because someModule is actually an object, not a function
typeof(someModule);
// "object"
为了回答我自己的问题,下面是让原型继承与此设计一起工作的方法。问题是,这是一个好的设计吗
var someModule = someModule || (function($) {
/*Initalize page*/
init();
/////////////////////
// Public Methods //
/////////////////////
var api = function()
{
...
}
api.prototype.example = function() {
alert("hi!");
}
//////////////////////
// Private Methods //
//////////////////////
function init() {
...
}
var public = new api();
return {
extend: api.prototype,
api:public
}
})(jQuery);
someModule.extend.newFunction = function(){
console.log('I'm altering the prototype!');
}
即使我返回一个函数的新实例…
构造函数返回普通对象(默认情况下),而不是函数。请参阅内部[[Construct]]
方法的一部分,该方法作为一个对象实例的结果调用。如果只有一个对象实例,为什么要扩展对象的原型?如果您正在为性能或继承模式创建许多实例,但示例代码也没有显示,则可以使用Prototype来共享成员。Jquery遵循类似的设计。$。fn实际上是其原型链的链接。我真的想利用原型继承和单个模块,因为我喜欢能够自由地向原型添加东西,但喜欢模块的隐私。矛盾的是的,我知道。jQuery返回许多实例。$或者jQuery是一个返回实例的函数,因此在其原型上有“find”和“on”这样的成员是有意义的<代码>$(document).constructor==$IIF返回的不是函数,不会使用someModule创建实例。