安全类型检查
typeof 检测类型机制并非完全可靠,所以直接使用 Object.prototype.toString.call(val)
作用域安全的构造函数
- 构造函数其实就是一个使用的了
new
操作符调用的函数, 当使用了new
操作符时候,构造函数内部用到的this
都指向了新创建的对象实例。 - 如果不使用
new
操作符直接调用定义的构造函数,那么this
就指向了window
, 这是由于js的晚绑定造成的所谓 绑定(binding),即把对象的接口与对象实例结合在一起的方法。
早绑定(early binding)是指在实例化对象之前定义它的属性和方法,这样编译器或解释程序就能够提前转换机器代码。在 Java 和 Visual Basic 这样的语言中,有了早绑定,就可以在开发环境中使用 IntelliSense(即给开发者提供对象中属性和方法列表的功能)。ECMAScript 不是强类型语言,所以不支持早绑定。
另一方面,晚绑定(late binding)指的是编译器或解释程序在运行前,不知道对象的类型。使用晚绑定,无需检查对象的类型,只需检查对象是否支持属性和方法即可。ECMAScript 中的所有变量都采用晚绑定方法。这样就允许执行大量的对象操作,而无任何惩罚。
function Person (name) {
if(this instanceof Person) { //检查this对象是Person的一个实例
this.name = name;
} else {
return new Person (name)
}
}