Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从模块函数返回原型函数时出现非常奇怪的行为_Javascript_Design Patterns - Fatal编程技术网

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创建实例。