instanceof,判断一个实例是否属于某种类型。
// 判断 p 是否是 Person 类的实例
function Person(){}
var p = new Person();
console.log(p instanceof Person)//true
更重要的一点是 instanceof 可以在继承关系中用来判断一个实例是否属于它的父类型。
instanceof的内部实现:
function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
var O = R.prototype;// 取 R 的显示原型
L = L.__proto__;// 取 L 的隐式原型
while (true) {
if (L === null)
return false;
if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true
return true;
L = L.__proto__;
}
}
从代码中我们可以看到,instanceof是比较左侧的__proto__(隐式原型)和右侧的prototype(显示原型)是否相等,如果不相等,取左侧__proto__的__proto__,依次循环比较,直到取到Object.prototype.__proto__即null为止。
this instanceof Person 用来判断是否使用了new关键字。
this instanceof Person我们可以这么分解:this.__proto__和Person.prototype
没有使用new,this指向window,如果使用了new,回到上面作为构造函数使用:
第一步: 创建一个空的对象,vat o = {}。 第二步: 链接该对象(即设置该对象的构造函数)到另一个对象,即o.\__proto__ == Vue.prototype。 第三步: 将步骤1新创建的对象作为this的上下文 第四步: 如果该函数没有返回对象,则返回this
结果可以看做:o.__proto__ = this.__proto__= Person.prototype ;
如果使用new操作符的话,那么this instanceof Person 则为true
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。