!function(global){ //用函数包裹以防止基类的变量和函数在外部被更改
function DetectorBase(config)
{
if(!this instanceof DetectorBase){
throw new Error("Do't invoke without new.");
}
this.config = config;
this.analyze();
}
DetectorBase.prototype.detect = function(){
throw new Error("not implemented");
}
如上所示,就是老师前2段代码,没理解,第一段代码在function DetectorBase(){}外层添加了立即执行函数,按照注释:用函数包裹以防止基类的变量和函数在外部被更改,为什么这么说?不是说函数内部实现的属性和方法都属于局部变量离开这个函数都会销毁,为什么还要额外在外层添加这个立即执行函数?
问题二;既然是立即执行函数函数其结构应为(function(参数){//do sth})(),为什么没有圆括号?
问题三:对于立即执行函数里的参数global是干什么用的,不添加该参数会怎样?
问题四:
DetectorBase.prototype.detect = function(){
throw new Error("not implemented");
}
这个抛出是为了什么?后边的错误抛出全是为了如果不是构造器new出来的新对象,则抛出错误;此处的抛出错误是为了什么?
问题1:可以在函数外部通过defineproperty的方法添加、修改函数中的属性,所以是不安全的。
这是我的理解,不知道对不对~
我的理解,问题四:DetectorBase作为基类在proptype对象上定义了一个抽象方法detect并抛出一个异常,当子类继承了父类后,如果没有去定义detect方法,那么会通过原型链向上查找到父类的detect方法,抛出一个异常。如果子类定义了detect方法,那么就不会从原型链向上查找父类的方法。
问题1: 因为javascript语言是没有块级作用域的。请看javascript高级程序设计第76页。
只能回答问题二:!(){}同等于(function(){})