null을 확장하는 클래스를 작성하는 방법과 이유는 무엇입니까?
ES6에 추가 된 JavaScript의 클래스 구문 은 다음과 같이 확장null
하는 것이 합법적입니다 .
class foo extends null {}
일부 인터넷 검색은 ES에서 제안 된 것으로 나타났습니다. 이러한 선언은 오류 가 있음을 나타냅니다 . 그러나 다른 논평자들은 그들이
누군가가
{__proto__: null}
프로토 타입 이있는 클래스를 만들고 싶을 수 있습니다.
그리고 그 주장의 측면이 궁극적으로 우세했습니다.
이 가상의 사용 사례를 이해하기 어렵습니다. 우선, 그러한 클래스 의 선언 은 합법적이지만 이러한 방식으로 선언 된 클래스 를 인스턴스화 하는 것은 그렇지 않은 것 같습니다 . foo
Node.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
'developer tip' 카테고리의 다른 글
Apache에서 Clojure 웹 응용 프로그램을 통합하는 방법 (0) | 2020.12.26 |
---|---|
UIGesture를 뒤에있는 뷰로 전달 (0) | 2020.12.26 |
성능을 향상 시키려면 어떤 PHP opcode cacher를 사용해야합니까? (0) | 2020.12.26 |
이 이미지 처리 테스트에서 Swift가 C보다 100 배 느린 이유는 무엇입니까? (0) | 2020.12.26 |
package.json에 나열되지 않은 package-lock.json의 취약한 npm 패키지를 어떻게 수정합니까? (0) | 2020.12.26 |