为IIFE中的类定义原型函数,同时强制" new"

时间:2017-12-23 02:22:42

标签: javascript function class oop object

请考虑以下代码:



var a = (function()
{
  function a(str)
  {
    if(!(this instanceof a))
      return new a(str);

    console.log('a created with str: ' + str);
  }

  a.prototype.b = function()
  {
    console.log('a.b called');
  }

  return a;
})();

console.log(a);
a('asd');
a.b();




首先,IIFE的执行使用a方法prototype定义了班级b。然后return是类的构造函数,它存储在var a中。 console.log(a);在控制台中显示构造函数的代码,a('asd');正确生成一条说a created with str: asd的日志消息,这证实了这一点。

我不明白为什么行a.b();会导致Uncaught TypeError: a.b is not a function错误?为什么a.prototype定义没有转移到var a?我怎么能在那里得到它?

1 个答案:

答案 0 :(得分:1)

  

为什么行a.b();导致未捕获的TypeError:a.b不是   功能

这是因为内部函数只在行

上执行
a('asd');

但是此行返回对您从未存储的new a实例的引用,因此您无权访问原型方法。

请查看以下修改后的代码段。



var a = (function()
{
  function a(str)
  {
    if(!(this instanceof a))
      return new a(str);

    console.log('a created with str: ' + str);
  }

  a.prototype.b = function()
  {
    console.log('a.b called');
  }

  return a;
})();

console.log(a);
let c = a('asd'); // Here a holds a reference to inner a and inner a is now called, prototype b added
// a.b(); error, there is no b of (outer) a
c.b(); // This is now OK