美文网首页
详解instanceof

详解instanceof

作者: locky丶 | 来源:发表于2019-04-28 17:00 被阅读0次

定义(MDN)

instanceof运算符用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置。
注意任何位置 这四个字,也就是说,instanceof在自身对象上没匹配到对应属性时,会去向上查找,只到找到为止。

代码实现

function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}
var auto = new Car('Honda', 'Accord', 1998);

console.log(auto instanceof Car);
// expected output: true

console.log(auto instanceof Object);
// expected output: true

观察上述代码,auto即匹配了Car,又匹配了Car的父类Object,只要是在这条链上的上级对象,instanceof给到的值都是true。

本质

instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

// 定义构造函数
function C(){} 
function D(){} 

var o = new C();

o instanceof C; // true,因为 Object.getPrototypeOf(o) === C.prototype

o instanceof D; // false,因为 D.prototype不在o的原型链上

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

C.prototype = {};
var o2 = new C();

o2 instanceof C; // true

o instanceof C; // false,C.prototype指向了一个空对象,这个空对象不在o的原型链上.

D.prototype = new C(); // 继承
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true 因为C.prototype现在在o3的原型链上

需要注意的是,如果表达式 obj instanceof Foo 返回true,则并不意味着该表达式会永远返回true,因为Foo.prototype属性的值有可能会改变,改变之后的值很有可能不存在于obj的原型链上,这时原表达式的值就会成为false。另外一种情况下,原表达式的值也会改变,就是改变对象obj的原型链的情况,虽然在目前的ES规范中,我们只能读取对象的原型而不能改变它,但借助于非标准的proto伪属性,是可以实现的。比如执行obj.proto = {}之后,obj instanceof Foo就会返回false了。

其他

** myArray instanceof Array不靠谱 **
我们有时会用instanceof来检查对象是否为数组,但这并不严谨。
在浏览器中,我们的脚本可能需要在多个窗口之间进行交互。多个窗口意味着多个全局环境,不同的全局环境拥有不同的全局对象,从而拥有不同的内置类型构造函数。这可能会引发一些问题。比如,表达式 [] instanceof window.frames[0].Array 会返回false,因为 Array.prototype !== window.frames[0].Array.prototype,并且数组从前者继承。

起初,你会认为这样并没有意义,但是当你在你的脚本中开始处理多个frame或多个window以及通过函数将对象从一个窗口传到另一个窗口时,这就是一个有效而强大的话题。比如,实际上你可以通过使用 Array.isArray(myObj) 或者Object.prototype.toString.call(myObj) === "[object Array]"来安全的检测传过来的对象是否是一个数组。

** 与instanceof 类似的方法 **
hasOwnProperty(),它会返回一个布尔值,指示对象自身属性中是否具有指定的属性。

obj.hasOwnProperty(prop)

相关文章

  • instanceof 判对象与继承类

    Java 实例 – instanceof 关键字用法 | 菜鸟教程 脚本之家之instanceof用法详解 ins...

  • instanceof详解

    instanceof检测的是原型我们可以用一段代码模拟一下内部执行过程: 我们再来看几个例子: 我们发现,虽然 i...

  • 详解instanceof

    定义(MDN) instanceof运算符用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位...

  • javascript instanceof 详解

    顾名思义,instanceof就是检查某个实例是否是由某个类或其子类实例化出来的(说明一下,类是ES6的说法,而E...

  • this、原型链、继承

    深入详解javascript之delete操作符深入javascript(六):instanceof 运算符重新理...

  • 面试题【Day21】

    本篇绪论: 1,instanceof 2, this 1,instanceof instanceof用于检测构造函...

  • JS 关键字 instanceof 和 isPrototype

    instanceof instanceof用于判断 "对象" 是否是指定构造函数的 "实例" instanceof...

  • instanceof 的原理和实现

    instanceof是怎么判断数据类型的 instanceof是通过原型链判断,A instanceof B表示:...

  • 13. instanceof 的原理

    instanceof 的原理问题一:instanceof 的原理是什么? instanceof可以正确的判断对象的...

  • js中instanceof方法的使用和实现原理

    instanceof方法的定义 MDN上对instanceof方法的定义非常的简洁明,instanceof 运算符...

网友评论

      本文标题:详解instanceof

      本文链接:https://www.haomeiwen.com/subject/ypndnqtx.html