请考虑以下代码:
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
?我怎么能在那里得到它?
答案 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