在js高级的技巧中会用instanceof来创建作用域安全的构造函数。
instanceof运算符希望左操作数是一个对象,右操作数表示对象的类。如果左侧的对象是右侧类的实例,则表达式返回true;否侧返回falseJavascript中对象的类似通过初始化它们的构造函数来定义的。这样的话,instanceof的右操作数应当是一个函数。比如:

var d = new Date();    //通过计算Date()构造函数来创建一个新对象
d instanceof Date;     //计算结果为true,d是有Date()创建的
d instanceof Object;   //计算结果为true,所有对象都是Object的实例
d instanceof Number;   //计算结果为false,d不是一个Number对象
var a =[1,2,3];        //通过数组直接量的写法创建一个数组
a instanceof Array;    //计算结果为true,a是一个数组
a instanceof Object;   //计算结果为true,所有数组都是对象
a instanceof RegExp;   //计算结果为false,数组不是一个正则表达式

需要注意的是,所有对象都是Object的实例。但通过instanceof判断一个对象是否是一个类的实例的时候,这个判断也会包含对“父类”的检测。如果instanceof的左操作数不是一个对象的话,instanceof返回false,如果右操作数不是一个函数,则会抛出一个类型错误异常。

为了理解instanceof运算符是如何工作的,必须首先理解‘原型链’(protetype chain),原型链可作为Javascript的继承机制。Ok,我们来看看表达式‘ person1 instanceof Personjavascript到底是怎么执行的。
首先,Person 会先计算Person .protetype,找到其指向的原型链中的所有对象,然后在这些对象中查找person1 ,如果找到,则说明person1Person 的一个实例,返回true,否侧返回false。这其实就是判断Person.prototypeperson1的内部指针[[prototype]]两者引用是否相同。下图展示了对象之间的关系:

clipboard.png

以上是个人结合书本总结,若有不对,请指正。


ouou
8.7k 声望472 粉丝

进击的前端er...