盒子
盒子

instanceof vs isPrototypeOf

instanceofisPrototypeOf都可以判断一个对象的原型链是否包含了某个原型,作用类似,用法不一样而已:

1
2
3
4
var Person = function() {};
var person = new Person();
console.log(perosn instanceof Perosn); // true
console.log(Person.prototype.isPrototypeOf(person)); // true

模式:

1
2
instanceof A instanceof B // A是实例,B是构造函数
A.isPrototypeOf(B); // A是原型,B是实例

原理一样:都是在实例的隐形原型链找原型对象,存在返回true

不一样的一点,若没有构造函数呢?此时的instanceof将不能使用,如下:

1
2
3
4
var obj = {};
var copy = Object.create(obj);
obj.isPrototypeOf(copy); // true
copy instanceof obj; // 报错 ,此时的obj就是原型了,不是构造函数,obj => B.prototype

在此种情况下 ,只能用isPrototypeOf

参考链接

1
2
3
4
5
6
7
8
9
10
11
12
13
// 可看可不看
// 重写Object.create方法
Object.create = function(o) {
var F = function() {
var f = arguments.callee;
this.getConstructor = function() {
return f;
}
};
F.prototype = o;
F.prototype.constructor = F;
return new F();
}

此时有 copy instanceof copy.getConstructor(); // true

支持一下
扫一扫,支持 Alin
  • 微信扫一扫
  • 支付宝扫一扫