왜 JavaScript에서 (super .__ proto__ === this .__ proto__)가 true입니까?


10

JavaScript (ES6) 클래스 인 것 같습니다 super.__proto__ === this.__proto__.

왜 그런지 설명 할 수 있습니까? 동작은 다른 브라우저에서 일관된 것처럼 보이므로 이것이 사양의 어딘가에 지정되어 있다고 생각합니다.

다음 코드를 고려하십시오.

class Level1 {
    myFunc() {
        console.log('Level1');
    }
}

class Level2 extends Level1 {
    myFunc() {
        console.log('Level2');
    }
}

class Level3 extends Level2 {
    myFunc() {
        console.log('Level3 BEGIN ' + Math.random()); 
        super.__proto__.myFunc();
        console.log(super.__proto__ === this.__proto__);
        console.log('Level3 END'); 
    }
}

const foo = new Level3();
foo.myFunc();

나는 그 기대했을 것이다 super.__proto__.myFunc();함수를 호출 할 myFunc()클래스의 Level1저것 super.__proto__ !== this.__proto__. 대신 super.__proto__.myFunc();실제로 myFunc()클래스 Level3호출 (자체 호출) 후 두 번째 호출 myFunc()에서 class 호출합니다 Level2. super.__proto__ === this.__proto__코드가 보여 주면 완벽하게 이해할 수 있습니다.

super.__proto__ === this.__proto__이 예에서 이유를 설명 할 수 있습니까 ? 가능하면 사양의 관련 섹션에 대한 참조도 제공하십시오.

답변:


6

Object.prototype.__proto__getter가있는 속성입니다 [1] . 그것은 그 this가치 에 따라 작동 합니다. 실제이 없습니다 super될 객체 this값을 (당신이 쓸 수 없습니다 Object.getPrototypeOf(super)), 그냥 super그렇게, 속성을 보는 방법 this.__proto__super.__proto__만큼 같은 일을 의미 __proto__또한 어디서든 낮은 프로토 타입 체인에 정의되어 있지 않은가.

비교:

class Parent {
    get notProto() {
        return this instanceof Child;
    }
}

class Child extends Parent {
    test() {
        console.log(super.notProto);
    }
}

new Child().test();

// bonus: [1]
console.log(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__'));


나는 이것이 __proto__실제로 액세서 기능 Object.prototype이고 그 this가치 에 따라 작동하는 것과 관련 이 있다고 의심했습니다 . 그러나 나는 super이것이 실제로 이런 식으로 작동하도록 지정 되었다고 상상하지 못했습니다 . 나는 super대략과 동등한 것으로 생각 this.__proto__.__proto__했기 때문에 내가 기대했던 행동을 나타내는 super.__proto__것과 동등 했을 것 this.__proto__.__proto__.__proto__입니다. 스펙에서 정확한 동작 super이 지정된 곳을 알고 있습니까?
Jens Moser

@JensMoser : 조금 찾아 보 겠지만 super, 같은 일반적인 사용법을 상상해보십시오 super.setFoo('bar'). 인스턴스 대신 프로토 타입에서 작동하는 것을 원하지 않을 것입니다.
Ry-

@georg 나는 그것이 __proto__접근 자 속성 이라는 것을 알고 Object.prototype있습니다. 사양에 대한 참조를 요청할 때 super와 관련 하여 키워드 의 정확한 동작에 대한 참조를 의미했습니다 __proto__. 내 이전 의견을 참조하십시오.
Jens Moser

@ Ry- 네, 조금 단순화했습니다. 에 대한 나의 정확한 이해는와 super.setFoo('bar')동일하다는 것입니다 this.__proto__.__proto__.setFoo.call(this, 'bar'). 따라서 super올바른로 함수를 자동으로 호출합니다 this.
Jens Moser

1
@JensMoser super.__proto__( Level3클래스 의 해당 메소드 )는Reflect.get(Object.getPrototypeOf(Level3.prototype), "__proto__", this)
Bergi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.