mozilla
您的搜索结果

    instanceof

    概述

    instanceof 运算符可以用来判断某个构造函数的prototype属性是否存在另外一个要检测对象的原型链上。

    语法

    object instanceof constructor

    参数

    object
    要检测的对象.
    constructor
    某个构造函数

    描述

    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
    

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

    instanceof和多全局对象(多个frame或多个window之间的交互)

    在浏览器中,我们的脚本可能需要在多个窗口之间进行交互。多个窗口意味着多个全局环境,不同的全局环境拥有不同的全局对象,从而拥有不同的内置类型构造函数。这可能会引发一些问题。比如,表达式 [] instanceof window.frames[0].Array 会返回false,因为 Array.prototype !== window.frames[0].Array.prototype,因此你必须使用 Array.isArray(myObj) 或者 Object.prototype.toString.call(myObj) === "[object Array]"来判断myObj是否是数组。

    Mozilla开发者注意:
    In code using XPCOM instanceof has special effect: obj instanceof xpcomInterface (e.g. Components.interfaces.nsIFile) calls obj.QueryInterface(xpcomInterface) and returns true if QueryInterface succeeded. A side effect of such call is that you can use xpcomInterface's properties on obj after a successful instanceof test. Unlike standard JavaScript globals, the test obj instanceof xpcomInterface works as expected even if obj is from a different scope.

    例子

    例子: 表明String对象和Date对象都属于Object类型

    下面的代码使用了instanceof来证明:String和Date对象同时也属于Object类型

    var myString = new String();
    var myDate = new Date();
    
    myString instanceof String; // 返回true
    myString instanceof Object; // 返回true
    myString instanceof Date;   // 返回false
    
    myDate instanceof Date;     // 返回true
    myDate instanceof Object;   // 返回true
    myDate instanceof String;   // 返回false
    

    例子: 表明mycar属于Car类型,同时又属于Object类型

    下面的代码创建了一个类型Car以及该类型的对象实例mycar. instanceof运算符表明了这个mycar对象既属于Car类型又属于Object类型

    function Car(make, model, year) {
      this.make = make;
      this.model = model;
      this.year = year;
    }
    var mycar = new Car("Honda", "Accord", 1998);
    var a = mycar instanceof Car;    // 返回 true
    var b = mycar instanceof Object; // 返回 true
    

    规范

    Specification Status Comment
    ECMAScript 1st Edition. Standard Initial definition. Implemented in JavaScript 1.4
    ECMAScript 5.1 (ECMA-262)
    The instanceof operator
    Standard  
    ECMAScript 6 (ECMA-262)
    Relational Operators
    Release Candidate  

    浏览器兼容性

    Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
    Basic support (Yes) (Yes) (Yes) (Yes) (Yes)
    Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
    Basic support (Yes) (Yes) (Yes) (Yes) (Yes) (Yes)

    相关链接

    文档标签和贡献者

    Contributors to this page: teoli, ziyunfei, AlexChao, tiansh
    最后编辑者: tiansh,
    隐藏侧边栏