instanceof原理と簡単な実現

4754 ワード

1.何ですか
MDNにはinstanceofが記述されています.
The instanceof operator tests whether the prototype property of a constructor appears anywhere in the prototype chain of an object. instanceof演算子は、コンストラクション関数のprototypeプロパティがオブジェクトプロトタイプチェーン内の任意の場所に表示されるかどうかをテストするために使用されます.
2.実現
ここでは、どのように実現するかを説明しています.
  • 最初のinstanceofの左側は、そのプロトタイプチェーン
  • を見つけるためにオブジェクトでなければならない.
  • instanceof右側は関数でなければならず、関数はprototype属性
  • である.
  • 反復、左側オブジェクトのプロトタイプが右側のprototypeに等しくない場合、プロトタイプチェーンに沿って左側
  • を再付与.
    コード:
    const instance_of = (left, right) => {
    	//  false
    	const baseType = ['number', 'string', 'boolean', 'undefined', 'symbol']
    	if(baseType.includes(typeof left)) return false
    	//  
    	const RP = right.prototype
    	while(true) {
    		//  , left.__proto__.__proto__.... null, 
    		//   null instanceof    ,  Object,  
    		if(left === null) {
    			return false
    		} else if(left === RP) {
    			return true
    		}
    		//   ?  left 
    		left = left.__proto__
    	}
    }
    

    3.注意が必要な場合
    以下の状況はfalse
    /** 
    *   'abc'  ,   
    *   'abc'.__proto__ === String.prototype  
    *  ,  (  'abc'.__proto__ ), , 
    *   new String('abc')
    *   'abc' instanceof String  
    */
    'abc' instanceof String  // false
    
    // null , null __proto__ 
    null instanceof Object  // false
    
    // String.__proto__.constructor.name === 'Function'
    String instanceof String // false
    Number instanceof Number  // false
    //....
    //....