instanceof原理解析

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。 ​

语法

object instanceof Constructor

object //某个实例对象
Constructor //某个构造函数

实例验证
验证的过程中会使用Object.getPrototypeOf(Object),Object.getPrototypeOf() 方法返回指定对象的原型(内部[[Prototype]]属性的值)。

function F1(){}
function F2(){}

let f1 = new F1();

f1 instanceof F1 //true,因为 Object.getPrototypeOf(f1) === F1.prototype
f1 instanceof F2 //false,因为 F2.prototype 不在 f1 的原型链上

f1 instanceof Object; // true,因为 Object.prototype.isPrototypeOf(f1) 返回 true
F1.prototype instanceof Object // true,同上

但 f1 instanceof F1 并不是永远返回 true的。在实例中,function F1(){}创建了一个名为F1的函数,let f1 = new F1()创建了一个名为 f1 的 F1 实例,即 f1 继承 F1。 F1.prototype 指向了一个对象,这个对象在 f1 的原型链上,Object.getPrototypeOf(f1) === F1.prototype可以验证这一点。如果我们修改了 F1.prototype 的值,f1 instanceof F1就可能为 false

F1.prototype = {}
f1 instanceof F1 //false

当 F1.prototype指向了一个空对象,这个空对象就不再存在于 f1 的原型链上了。我们需要明确这一点,f1 instanceof F1 === false并不是因为 F1.prototype为空,而是因为F1.prototype不在 f1 的原型链上。

let f3 = new F1()
f1 instanceof F1 //false
f3 instanceof F1 //true

以此类推,修改f3.proto的值也有异曲同工的效果

f3.__proto__ = {}
f3 instanceof F1 //false

特殊情况

instanceof 左边类型不为 object 的情况
object instanceof constructor,如果左侧不是 object,return false。

1 instanceof Number //false

let a = new Number(1);
a instanceof Number // true

String 对象和 Date 对象都属于 Object 类型和一些特殊情况
String 和 Date 对象 同时也属于 Object 类型(他们是由Object类派生出来的) ​

但是,使用对象文字符号创建的对象在这里是一个例外:虽然原型未定义,但 instanceof Object 返回 true。

var simpleStr = "This is a simple string";
var myString  = new String();
var newStr    = new String("String created with constructor");
var myDate    = new Date();
var myObj     = {};
var myNonObj  = Object.create(null); //一种创建非 Object 实例的对象的方法

simpleStr instanceof String; // 返回 false, 非对象实例,因此返回 false
myString  instanceof String; // 返回 true
newStr    instanceof String; // 返回 true
myString  instanceof Object; // 返回 true

myObj instanceof Object;    // 返回 true, 尽管原型没有定义
({})  instanceof Object;    // 返回 true, 同上
myNonObj instanceof Object; // 返回 false, 

myString instanceof Date; //返回 false

myDate instanceof Date;     // 返回 true
myDate instanceof Object;   // 返回 true
myDate instanceof String;   // 返回 false

判断自身的情况

使用 instanceof 用于判断对象类型时,以下情况都为 false

Number instanceof Number // false
String instanceof String //false
null instanceof Object // false null不具有任何对象的特性,也没有__proto__属性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真不爱学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值