new와 instanceof의 내부 메커니즘

5194 단어 instanceof
우선 var obj = new O () 라는 문장에 무슨 일이 일어났는지 살펴보자.
var obj = (function(){

    var obj = {};

    obj.__proto__ = O.prototype;



    // ...



    return obj;

})();

즉 var obj = new O () 는 은밀한 원형 체인 ( proto) 을 되돌려줍니다.O 원형(prototype)을 가리킨다.이것이 바로 new의 내부 작업 방식이다.
다음에 instanceof를 보면 현재 xinstanceofy라는 문장이 있다고 가정하면 그 내부는 실제적으로 다음과 같은 판단을 내렸다.
while(x.__proto__!==null) {
  if(x.__proto__===y.prototype) {
    return true;
    break;
  }
  x.__proto__
= x.__proto__.proto__; }
if(x.__proto__==null) {return false;}

x는 은밀한 원형 체인을 따라proto__x. 까지 위로 찾기proto__.__proto__......===y.prototype까지 찾으면true, 즉 x가 y인 실례를 되돌려줍니다.그렇지 않으면false를 되돌려줍니다. x는 y의 실례가 아닙니다.
다음은 두 가지 예를 들어 O의 원형(prototype)에 대한 수정을obj의 성명 이전과 이후의 두 가지 상황에서 instanceof를 사용하여obj를 검측한 결과를 비교한다.
 1 function F(){}

 2 function O(){}

 3 

 4 O.prototype = new F();

 5 var obj = new O();

 6 /*
    
    var obj = (function(){
      var obj1 = {};
      var obj2 = {};
      obj2.__proto__ = F.prototype;
      obj.__proto__ = obj2;
      return obj;
    })()
  */ 7 console.log(obj instanceof O);//true 8 console.log(obj instanceof F);//true 9 console.log(obj.__proto__===O.prototype);//true 10 console.log(obj.__proto__.__proto__===F.prototype);//true

위 예에서 obj.proto__o.prototype과 모두 new F () 대상을 가리키기 때문에 obj instanceof o 결과는true입니다.
위의 new F () 대상이 objF라고 가정하면 new 내부 메커니즘에 따라 objF.proto__===F.prototype, objF.proto__obj.proto__.__proto__.
그래서 obj instanceof F 결과도true였다.
 1 function F(){}

 2 function O(){}

 3 

 4 var obj = new O();

 5 o.prototype = new F();

 6 

 7 console.log(obj instanceof O);//false

 8 console.log(obj instanceof F);//false

 9 console.log(obj.__proto__===O.prototype);//false

10 console.log(obj.__proto__.__proto__===F.prototype);//false

또한 위의 new F()라는 객체가 objF라고 가정합니다.
이 예에서obj.prototype의 수정은obj의 성명 이후, 즉obj.proto__o 최초의prototype을 가리키며 자연스럽게obj.proto__objF와도 다르다.그래서 obj instanceof O 결과는false입니다.
마지막으로, obj instance F가false인 것도 잘 이해한다. 이것은obj. 때문이다proto__.__proto__가리키는 것은 Object입니다.prototype.

좋은 웹페이지 즐겨찾기