developer tip

null을 확장하는 클래스를 작성하는 방법과 이유는 무엇입니까?

optionbox 2020. 12. 26. 09:57
반응형

null을 확장하는 클래스를 작성하는 방법과 이유는 무엇입니까?


ES6에 추가 된 JavaScript의 클래스 구문 은 다음과 같이 확장null 하는 것이 합법적입니다 .

class foo extends null {}

일부 인터넷 검색은 ES에서 제안 된 것으로 나타났습니다. 이러한 선언은 오류 있음을 나타냅니다 . 그러나 다른 논평자들은 그들이

누군가가 {__proto__: null}프로토 타입 이있는 클래스를 만들고 싶을 수 있습니다.

그리고 그 주장의 측면이 궁극적으로 우세했습니다.

이 가상의 사용 사례를 이해하기 어렵습니다. 우선, 그러한 클래스 선언 은 합법적이지만 이러한 방식으로 선언 된 클래스 인스턴스화 하는 것은 그렇지 않은 것 같습니다 . fooNode.js 또는 Chrome에서 위에서 클래스를 인스턴스화하려고 하면 놀랍도록 멍청한 오류가 발생합니다.

TypeError: function is not a function

Firefox에서 동일한 작업을 수행하는 동안

TypeError: function () {
} is not a constructor

MDN의 현재 기능 예에서 볼 수 있듯이 클래스에 생성자를 정의하는 것은 도움이되지 않습니다. 이 클래스를 인스턴스화하려고하면 :

class bar extends null {
  constructor(){}
}

그런 다음 Chrome / Node가 알려주세요.

ReferenceError: this is not defined

Firefox는 다음과 같이 말합니다.

ReferenceError: |this| used uninitialized in bar class constructor

이 모든 광기는 무엇입니까? 이러한 null 확장 클래스가 인스턴스화 할 수없는 이유는 무엇입니까? 그리고 그것들이 인스턴스화 될 수 없다는 점을 감안할 때, 그것들을 생성 할 가능성이 의도적으로 사양에 남겨진 이유는 무엇이며, 일부 MDN 작성자는 문서화하기에 충분히 주목할 만하다고 생각한 이유는 무엇입니까? 이 기능에 대해 가능한 사용 사례는 무엇입니까?


이러한 클래스를 인스턴스화하는 것은 작동합니다. Chrome과 Firefox에는 버그가 있습니다. 여기에 크롬이 있고, 여기에 파이어 폭스가 있습니다. Safari에서 잘 작동합니다 (최소한 마스터에서는).

예전 에는 사양에 버그 로 인해 인스턴스화가 불가능했지만 한동안 수정되었습니다. ( 여전히 관련된 것이 있지만 그것은 당신이보고있는 것이 아닙니다.)

사용 사례는의 사용 사례와 거의 동일합니다 Object.create(null). 때때로 당신은 Object.prototype.


두 번째 부분에 답하려면 :

이 가상의 사용 사례를 이해하기 어렵습니다.

이렇게하면 개체가 Object.prototype프로토 타입 체인에 포함 되지 않습니다 .

class Hash extends null {}
var o = {};
var hash = new Hash;
o["foo"] = 5;
hash["foo"] = 5;
// both are used as hash maps (or use `Map`).
hash["toString"]; // undefined
o["toString"]; // function

우리가 알다시피 undefined사실 함수 가 아닙니다 . 이 경우 존재해서는 안되는 필드에 대한 호출을 두려워하지 않고 객체를 만들 수 있습니다.

이것은 일반적인 패턴 Object.create(null)이며 NodeJS와 같은 큰 코드베이스를 포함한 많은 코드베이스에서 일반적입니다.

참조 URL : https://stackoverflow.com/questions/41189190/how-and-why-would-i-write-a-class-that-extends-null

반응형