JavaScript 实现一个相对稳定的 __instanceof 类型判断函数

    JavaScript 中 instanceof 关键字用于判断实例的类型,在某些情况下它并不能正确的判断实例的类型,例如:变量指定的o是Foo类的实例,但 instanceof 关键字判断结果返回 false,但这种情况一般很少发生主要容易集中在一个 closure 函数中。

    另一个问题是,在某些浏览器中 instanceof 关键字判断”实例“是否指定”类型“的实例时,是利用”实例“的 不可枚举属性(constructor)来与指定“类型”比较的,但“constructor”在一些浏览器中是允许被修改的。

    一个好的办法是,结合 prototype chains( 原型链)来判断实例的类型,但若原型链被恶意修改,它可能也无法绕过上面的问题,不过它相对稳定,正常情况下恶意访问 __proto__ 的属性的可能性,要远远低于 constructor,下面给出一个关于 __instanceof 函数的示例。

var Foo = (function() {
  this.A = 10;
})
var foo = new Foo();
console.log(__instanceof(foo, Foo))
console.log(__instanceof(foo, 'Foo'))
    以下为 __instanceof 函数的实现。
// 确认是否是指定类型的实例。
var __instanceof = function (instance, type) {
    'use strict'


    if (typeof type === 'string') {
        type = eval(type);
    }
    if (typeof type !== 'function') {
        return false;
    }
    var x1 = instance instanceof type;
    if (x1) {
        return true;
    }
    var x2 = false;
    if (instance !== null && instance !== undefined) {
        var current = instance.constructor;
        if (current === type) {
            return true;
        }
        var __instproto__ = instance;
        var __typesource = type.toString();
        if (current && current.toString() === __typesource) {
            return true;
        }
        do {
            __instproto__ = __instproto__.__proto__;
            if (__instproto__) {
                x2 = __instproto__.constructor === type;
                if (x2) {
                    return true;
                }
                x2 = __typesource === __instproto__.constructor.toString();
                if (x2) {
                    return true;
                }
            }
        } while (__instproto__);
    }
    return x1 || x2;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值