1.函数柯理化
概念:
实现:
应用场景:
(1)setTimeout
(2)事件绑定
2.构建作用域安全的构造函数
一般我们写构造函数时都是采用下面的形式:
function Person(name,age){
this.name=name;
this.age=age;
}
调用时采用var p=new Person("ddd",23);这样的形式,但是如果,不采用new操作符,直接调用var p=Person("ddd",23);就会造成构造函数内的this指向window,造成window对象内的属性混乱,所以有必要在构造函数内重新审核判断一下:
function Person(name,age){
if(this instanceof Person){
this.name=name;
this.age=age;
}else {
return new Person(name,age);
}
}
但是这样写也有一个问题,会出现在只使用构造函数窃取模式的继承而未使用原型进行继承时,例如如果有个Chinese类通过构造函数窃取继承了 Person类。
function Chinese(name,age,nation){
Person.call(this,name,age);
this.nation=nation;
}
var c=new Chinese("zhangdan",23,"han");
console.log(c.name);//undefined
在这段代码中,Person的构造函数时作用域安全的,儿chinese构造函数不是,先创建一个chinese实例之后,这个实例通过Person.call来继承Person的name和age属性,但是,由于Person构造函数时作用域安全的,this对象并非Person的实例,所以会创建并且返回一个新的Person对象,chines构造函数中的this对象并没有得到增长,同时Person.call()返回的值也没有用到,所以chinese实例中没有name和age属性,但是如果将原型继承增加进来就可以了。
将构造函数窃取模式继承与原型继承组合起来,就可以解决该问题,加入以下代码:
Chinese.prototype=new Person();