zoukankan      html  css  js  c++  java
  • js中的instanceof运算符

    js中的instanceof运算符

    概述

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

    语法

    obj instanceof Object;//true 实例obj在不在Object构造函数中
    

    描述

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


    实例

    1.instanceof的普通的用法,obj instanceof Object 检测Object.prototype是否存在于参数obj的原型链上。

    Person的原型在p的原型链中

    function Person(){};
    var p =new Person();
    console.log(p instanceof Person);//true
    

    2.继承中判断实例是否属于它的父类

    Student和Person都在s的原型链中

    function Person(){};
    function Student(){};
    var p =new Person();
    Student.prototype=p;//继承原型
    var s=new Student();
    console.log(s instanceof Student);//true
    console.log(s instanceof Person);//true
    

    3.复杂用法

    这里的案例要有熟练的原型链的认识才能理解

    function Person() {}
    console.log(Object instanceof Object);     //true
    //第一个Object的原型链:Object=>
    //Object.__proto__ => Function.prototype=>Function.prototype.__proto__=>Object.prototype
    //第二个Object的原型:Object=> Object.prototype
    
    console.log(Function instanceof Function); //true
    //第一个Function的原型链:Function=>Function.__proto__ => Function.prototype
    //第二个Function的原型:Function=>Function.prototype
    
    console.log(Function instanceof Object);   //true
    //Function=>
    //Function.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
    //Object => Object.prototype
    
    console.log(Person instanceof Function);      //true
    //Person=>Person.__proto__=>Function.prototype
    //Function=>Function.prototype
    
    console.log(String instanceof String);   //false
    //第一个String的原型链:String=>
    //String.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
    //第二个String的原型链:String=>String.prototype
    
    console.log(Boolean instanceof Boolean); //false
    //第一个Boolean的原型链:Boolean=>
    //Boolean.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
    //第二个Boolean的原型链:Boolean=>Boolean.prototype
    
    console.log(Person instanceof Person); //false
    //第一个Person的原型链:Person=>
    //Person.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
    //第二个Person的原型链:Person=>Person.prototype
    
    

    总结

    对应上述规范做个函数模拟A instanceof B:

    function _instanceof(A, B) {
    	var O = B.prototype;// 取B的显示原型
    	A = A.__proto__;// 取A的隐式原型
    	while (true) {
    		//Object.prototype.__proto__ === null
    		if (A === null)
    			return false;
    		if (O === A)// 这里重点:当 O 严格等于 A 时,返回 true
    			return true;
    		A = A.__proto__;
    	}
    }
    
  • 相关阅读:
    Excel宏打开URL 特殊字符#变了
    windows升级到1607后操作很卡顿的解决办法
    打包解决方案后,安装时提示只能在IIS5.1以上运行解决方法
    在CS代码页获取input输入框内肉----.net学习点滴
    greenplum 6.7编译安装插件pxf
    greenplum 6.7编译安装插件mysql_fdw
    python3 + greenplum-spark-connector访问greenplum
    centos7无cm安装hadoop+spark
    hive实现update和delete功能
    使得hivecli访问hive
  • 原文地址:https://www.cnblogs.com/SourceKing/p/5766210.html
Copyright © 2011-2022 走看看