本章内容
- 使用高级函数
- 放篡改对象
- Yielding with Timers
1.高级函数
函数是复杂和动态的,一些额外的功能可以通过闭包来实现。由于所有的函数都是对象,所以使用函数的指针非常简单。
1.1安全类型检测
使用typeof操作符会导致检测数据类型时得到不靠谱的结果。
instanceof在全局作用域下也会有很多问题。
使用Object.prototype.toString.call()来判断是否为某个对象的类型。
var toString = Object.prototype.toString;
console.log(toString.call(new Date)); // [object Date]
console.log(toString.call(new String)); // [object String]
console.log(toString.call(Math)); // [object Math]
//Since JavaScript 1.8.5
console.log(toString.call(undefined)); // [object Undefined]
console.log(toString.call(null)); // [object Null]
1.2作用域安全的构造函数
function Person(name,age,sex){
this.name = name
this.age = age
this.sex = sex
}
//正确创建新对象,三个属性被加到person上
var person1 = new Person('lizhi',19,'girl')
//Person {name: "lizhi", age: 19, sex: "girl"}
console.log(person1)
//错误创建Person实例,三个属性被加到window上,
//此时person没有属性
var person = Person("a",1,"b")
//undefined
console.log(person)
解决办法:创建作用域安全的构造函数
function Person(name, age, job){
//判断是不是Person实例
if (this instanceof Person){
this.name = name;
this.age = age;
this.job = job;
} else {
return new Person(name, age, job);
}
}
var person1 = Person("Nicholas", 29, "Software Engineer");
console.log(window.name); //""
console.log(person1.name); //"Nicholas"
var person2 = new Person("Shelby", 34, "Ergonomist");
console.log(person2.name); //"Shelby"
推荐使用作用域安全的构造函数。
惰性载入函数
先理解函数重写。惰性载入函数的原理就是第一次执行后要判断然后进行重写函数,这样之后调用时函数便无需判断直接执行之前重写过的函数。下面这个博客写的很清楚。
介绍 函数重写 与 惰性载入函数