>웹 프론트엔드 >JS 튜토리얼 >JavaScript의 새로운 개인 클래스 필드 및 사용 방법

JavaScript의 새로운 개인 클래스 필드 및 사용 방법

Joseph Gordon-Levitt
Joseph Gordon-Levitt원래의
2025-02-10 14:30:15757검색

JavaScript's New Private Class Fields, and How to Use Them ES6은 JavaScript 용 클래스를 소개하지만 복잡한 응용 프로그램의 경우 너무 간단 할 수 있습니다. 클래스 필드 (

클래스 속성

라고도 함)는 개인 및 정적 멤버로 생성자를 단순화하도록 설계되었습니다. 이 제안은 현재 TC39 3 단계 : 후보 단계에 있으며 ES2019 (ES10)에 추가 될 것입니다. Node.js 12, Chrome 74 및 Babel은 현재 개인 필드를 지원합니다. 클래스 필드가 어떻게 구현되는지 이해하기 전에 ES6 클래스를 검토하는 것이 유용합니다. 이 기사는 2020 년에 업데이트되었습니다. 보다 심층적 인 JavaScript 지식을 보려면 "JavaScript : Newbie에서 Ninja, Second Edition"을 읽으십시오. 키 포인트 ES6은 JavaScript 용 클래스를 소개하지만 복잡한 응용 프로그램의 경우 너무 간단 할 수 있습니다. ES2019의 클래스 필드는 ES2019 (ES10)에 추가 될 수있는 개인 및 정적 멤버로 생성자를 단순화하도록 설계되었습니다.

새로운 클래스 필드 구현을 통해 클래스 상단에있는 모든 생성자 외부의 공개 속성을 초기화 할 수 있습니다. 생성자가 여전히 필요한 경우 초기화기가 실행되기 전에 실행됩니다.

ES2019의 클래스 필드를 사용하면 해시# 접두사를 사용하여 개인 클래스 필드를 선언 할 수 있습니다. 이를 통해 필드는 클래스 외부가 아닌 클래스의 내부 방법에서만 액세스 할 수 있습니다. 클래스 필드에서 사유성을 나타내는 # 사용은 비판을 받았으며, 주로 개인 키워드만큼 직관적이지 않기 때문입니다. 그러나 # 기호는 클래스 정의 외부에서 유효하지 않아 개인 필드가 비공개로 유지되도록합니다. ES2019 클래스 필드의 즉각적인 이점은 클리너 반응 코드입니다. ES6 = & gt를 사용하여 함수로 할당 할 수 있으며, 이는 바인딩 선언없이 자동으로 정의 객체에 바인딩됩니다.

  • es6 카테고리 기본 사항
  • C, C#, Java 및 PHP와 같은 언어의 개발자는 JavaScript의 객체 지향 상속 모델에 의해 혼란 스러울 수 있습니다. 따라서 ES6은
  • 클래스 를 소개했습니다. 그들은 대부분 구문 설탕이지만 객체 지향 프로그래밍의보다 친숙한 개념을 제공합니다. 클래스는 해당 유형의 객체가 작동하는 방식을 정의하는 객체 템플릿
  • 입니다. 다음 동물 계급은 일반 동물을 정의합니다 (클래스는 일반적으로 대상 및 기타 유형과 구별하기 위해 초기 대문자로 표시됩니다) :
  • 클래스 선언은 항상 엄격한 모드로 실행됩니다. 'Strict 사용'을 추가 할 필요가 없습니다. 생성자 메소드는 유형 동물의 물체를 만들 때 실행됩니다. 일반적으로 초기 속성을 설정하고 다른 초기화를 처리합니다. speak () 및 walk ()는 더 많은 기능을 추가하는 인스턴스 메소드입니다. 이제 새 키워드를 사용 하여이 클래스에서 객체를 만들 수 있습니다.
  • getter and setter
setter

는 값을 정의하는 데만 사용되는 특수 메소드입니다. 마찬가지로, getter 는 반환 값에 대한 특별한 방법입니다. 예를 들면 :

서브 클래스 또는 서브 클래스 일반적으로 한 클래스를 다른 클래스의 기본 클래스로 사용하는 것이 가능합니다. 인간 계급은 확장 키워드를 사용하여 동물 클래스의 모든 속성과 메소드를 물려받을 수 있습니다. 인간 물체를 더 쉽고 명확하게 만드는 데 필요에 따라 속성과 방법을 추가, 제거 또는 변경할 수 있습니다.

슈퍼는 상위 클래스를 말하므로 일반적으로 생성자에서 호출 된 첫 번째 호출입니다. 이 예에서, 인간 speak () 메소드는 동물에 정의 된 방법을 무시합니다. 이제 인간 대상의 인스턴스를 만들 수 있습니다.

<code class="language-javascript">class Animal {

  constructor(name = 'anonymous', legs = 4, noise = 'nothing') {

    this.type = 'animal';
    this.name = name;
    this.legs = legs;
    this.noise = noise;

  }

  speak() {
    console.log(`${this.name} says "${this.noise}"`);
  }

  walk() {
    console.log(`${this.name} walks on ${this.legs} legs`);
  }

}</code>
정적 메소드 및 속성

정적 키워드를 사용하여 메소드를 정의하면 객체 인스턴스를 만들지 않고 클래스에서 호출 할 수 있습니다. Math.pi 상수를 고려하십시오 : PI 속성에 액세스하기 전에 수학 객체를 만들 필요가 없습니다. ES6은 다른 언어와 동일한 정적 속성을 지원하지 않지만 클래스 정의 자체에 속성을 추가 할 수 있습니다. 예를 들어, 인간 계급은 얼마나 많은 인간 대상이 생성되었는지를 수용하도록 조정할 수 있습니다.

<code class="language-javascript">let rex = new Animal('Rex', 4, 'woof');
rex.speak();          // Rex says "woof"
rex.noise = 'growl';
rex.speak();          // Rex says "growl"</code>
클래스의 정적 카운트 getter는 그에 따라 인간의 수를 반환합니다.

ES2019 클래스 필드 ( new ) 새로운 클래스 필드 구현은 클래스 상단에있는 생성자 외부의 공개 속성을 초기화 할 수 있습니다.

이것은 다음과 같습니다

여전히 생성자가 필요한 경우 이니셜 라이저가 실행되기 전에 실행됩니다.

정적 클래스 필드 위의 예에서, 정적 특성은 클래스 객체를 정의한 후에는 부적절한 방식으로 클래스 정의 객체에 추가됩니다. 클래스 필드를 사용할 필요가 없습니다
<code class="language-javascript">class Animal {

  constructor(name = 'anonymous', legs = 4, noise = 'nothing') {

    this.type = 'animal';
    this.name = name;
    this.legs = legs;
    this.noise = noise;

  }

  speak() {
    console.log(`${this.name} says "${this.noise}"`);
  }

  walk() {
    console.log(`${this.name} walks on ${this.legs} legs`);
  }

  // setter
  set eats(food) {
    this.food = food;
  }

  // getter
  get dinner() {
    return `${this.name} eats ${this.food || 'nothing'} for dinner.`;
  }

}

let rex = new Animal('Rex', 4, 'woof');
rex.eats = 'anything';
console.log( rex.dinner );  // Rex eats anything for dinner.</code>
이것은 다음과 같습니다

개인 클래스 필드 es6 클래스의 모든 속성은 기본적으로 공개되며

클래스 외부에서 점검하거나 수정할 수 있습니다. 위의 동물 예에서는 Eats Setter를 부르지 않고 식품 재산을 변경하는 것을 막을 수있는 것은 없습니다.
<code class="language-javascript">class Human extends Animal {

  constructor(name) {

    // 调用Animal构造函数
    super(name, 2, 'nothing of interest');
    this.type = 'human';

  }

  // 重写Animal.speak
  speak(to) {

    super.speak();
    if (to) console.log(`to ${to}`);

  }

}</code>
다른 언어는 일반적으로 개인 속성을 선언 할 수 있습니다. ES6에서는 불가능하므로 개발자는 종종 밑줄 컨벤션 (_propertyName), 클로저, 기호 또는 약점을 사용 하여이 문제를 해결합니다. 밑줄은 개발자에게 힌트를 제공하지만 부동산에 접근하는 것을 막을 수는 없습니다. ES2019에서 개인 클래스 필드는 해시# 접두사를 사용하여 정의됩니다.

개인 방법, 게터 또는 세터는 정의 할 수 없습니다. TC39 3 단계 : 초안 제안은 바벨에서 구현 된 이름에 해시# 접두사를 사용하는 것이 좋습니다. 예를 들면 : 즉시 혜택 : 더 간결한 반응 코드! 반응 구성 요소에는 일반적으로 DOM 이벤트에 바인딩되는 방법이 있습니다. 이가 구성 요소로 해결되도록하려면 각 방법을 그에 따라 바인딩해야합니다. 예를 들면 :

inccount가 ES2019 클래스 필드로 정의되면 ES6 = & gt를 사용하여 함수로 할당 할 수 있으며, 이는 정의 객체에 자동으로 바인딩됩니다. 바인딩 진술을 추가 할 필요가 없습니다 :

<code class="language-javascript">let don = new Human('Don');
don.speak('anyone');        // Don says "nothing of interest" to anyone

don.eats = 'burgers';
console.log( don.dinner );  // Don eats burgers for dinner.</code>

클래스 필드 : 개선?

ES6 클래스의 정의는 너무 간단합니다. ES2019 클래스 필드는 코드가 적고, 가독성을 향상시키고, 객체 지향 프로그래밍을위한 흥미로운 가능성을 구현해야합니다. #을 사용하는 것은 민간성이 비판을 받았다는 것을 의미합니다. 주로 추악하고 기술처럼 느껴지 기 때문입니다. 대부분의 언어는 개인 키워드를 구현하므로 클래스 밖에서 해당 멤버를 사용하려고하면 컴파일러가 거부됩니다. JavaScript가 해석됩니다. 다음 코드를 고려하십시오

이것은 마지막 줄에 런타임 오류가 발생하지만 속성을 설정하려는 심각한 결과 일뿐입니다. JavaScript는 의도적으로 허용되지 않으며 ES5는 모든 객체에서 속성을 수정할 수 있습니다. 어색하지만 # 기호는 클래스 정의 외부에서 유효하지 않습니다. MyObject에 액세스하려고 시도합니다.#Secret은 구문 오류를 던질 수 있습니다. 이 토론은 계속 될 것이지만, 클래스 필드는 이미 여러 JavaScript 엔진에 채택되어 있거나 그렇지 않습니다. 그들은 계속 존재할 것입니다.

JavaScript 개인 클래스 필드에 대한 FAQS (FAQS)
<code class="language-javascript">class Animal {

  constructor(name = 'anonymous', legs = 4, noise = 'nothing') {

    this.type = 'animal';
    this.name = name;
    this.legs = legs;
    this.noise = noise;

  }

  speak() {
    console.log(`${this.name} says "${this.noise}"`);
  }

  walk() {
    console.log(`${this.name} walks on ${this.legs} legs`);
  }

}</code>
JavaScript 개인 클래스 필드를 사용하면 어떤 이점이 있습니까?

JavaScript의 개인 클래스 필드는 객체 지향 프로그래밍의 기본 원칙 인 클래스에서 데이터를 캡슐화하거나 숨길 수있는 방법을 제공합니다. 이 캡슐화는 객체의 내부 상태가 명시 적으로 정의 된 클래스에 의해서만 변경 될 수 있도록합니다. 이로 인해 코드는 외부 코드가 실수로 객체 상태를 예기치 않은 방식으로 변경하는 것을 방지하기 때문에 코드를보다 강력하고 예측할 수 있습니다. 또한 개인 필드는 외부 세계에 노출 된 속성 및 방법의 수를 줄이기 때문에 클래스 인터페이스를 단순화하는 데 도움이 될 수 있습니다.

JavaScript에서 개인 클래스 필드를 선언하는 방법은 무엇입니까?

JavaScript에서 필드 이름 앞에 해시 (#) 기호를 추가하여 개인 클래스 필드가 선언됩니다. 예를 들어, 클래스에서 "value"라는 개인 필드를 선언하려면 #Value를 쓸 수 있습니다. 이 필드는 클래스 외부가 아닌 클래스의 내부 방법에서만 액세스 할 수 있습니다. 클래스 외부에서 개인 클래스 필드에 액세스 할 수 있습니까? 아니요, JavaScript의 개인 클래스 필드는 클래스 외부에서 액세스 할 수 없습니다. 개인 필드의 주요 용도 중 하나는 외부 세계에서 내부 데이터를 숨기는 것이기 때문에 디자인입니다. 클래스 외부에서 개인 필드에 액세스하려고하면 JavaScript에 구문 오류가 발생합니다.

공공 필드와 함께 개인 클래스 필드를 사용할 수 있습니까?

예, JavaScript 클래스는 개인 및 공공 분야를 모두 가질 수 있습니다. 공공 분야는 개인 분야와 같은 방식으로 선언되지만 해시 (#) 접두사는 없습니다. 클래스 내부에서만 액세스 할 수있는 개인 필드와 달리 공공 필드에 액세스하고 클래스 내부 및 외부에서 수정할 수 있습니다.

개인 클래스 필드는 JavaScript의 개인 방법과 어떻게 다릅니 까?

JavaScript의 개인 클래스 필드 및 개인 방법은 비슷한 용도를 가지고 있으며, 둘 다 외부 세계에서 클래스의 내부 세부 사항을 숨길 수있는 방법을 제공합니다. 그러나 다르게 사용됩니다. 개인 필드는 클래스 내부에서만 액세스 할 수있는 데이터를 저장하는 데 사용되며 개인 방법은 클래스 내에서만 호출 할 수있는 기능입니다.

모든 JavaScript 환경에서 개인 클래스 필드를 사용할 수 있습니까?

개인 클래스 필드는 JavaScript의 비교적 새로운 기능이므로 모든 환경이이를 지원하는 것은 아닙니다. 작성 당시 Chrome, Firefox 및 Safari를 포함한 대부분의 주요 브라우저의 최신 버전은 개인 필드를 지원합니다. 그러나 Internet Explorer는이를 지원하지 않습니다. 모든 브라우저에서 실행되는 코드를 작성 해야하는 경우 Babel과 같은 변환기를 사용하여 코드를 구형 브라우저에서 이해할 수있는 형태로 변환해야 할 수도 있습니다.

클래스의 내부 방법에서 개인 클래스 필드를 사용하는 방법은 무엇입니까?

클래스의 내부 메소드에서 개인 클래스 필드를 사용하려면 이름이있는 필드를 참조하십시오 (해시 (#) 기호로 접두사). 예를 들어, "value"라는 개인 필드가있는 경우 다음과 같은 메소드에서 액세스 할 수 있습니다. this.#value.

서브 클래스에서 개인 클래스 필드를 사용할 수 있습니까?

예, 개인 클래스 필드는 JavaScript의 서브 클래스에서 사용할 수 있습니다. 그러나 각 서브 클래스에는 슈퍼 클래스 또는 기타 서브 클래스와 공유되지 않은 독립적 인 개인 필드 세트가 있습니다. 이는 서브 클래스로 선언 된 개인 필드가 슈퍼 클래스의 개인 필드와 동일한 이름 인 경우, 두 필드는 완전히 독립적이며 서로를 방해하지 않습니다.

정적 메소드에서 개인 클래스 필드를 사용할 수 있습니까?

아니요, JavaScript의 개인 클래스 필드는 정적 메소드에서 사용할 수 없습니다. 이는 정적 방법이 클래스의 경우가 아니라 클래스 자체와 관련되며 개인 필드는 클래스의 경우에만 액세스 할 수 있기 때문입니다.

JavaScript에서 개인 클래스 필드를 반복 할 수 있습니까?

아니요, JavaScript의 개인 클래스 필드는 객체의 속성 반복에 포함되지 않습니다. 개인 필드의 주요 용도 중 하나는 외부 세계에서 내부 데이터를 숨기는 것이기 때문에 디자인입니다. 객체의 속성을 반복 해야하는 경우 대신 공용 필드 나 방법을 사용해야합니다.

이 응답은 원래 이미지 형식과 배치를 유지하고 원래의 의미를 보존하면서 텍스트를 역설적으로 표현합니다.

위 내용은 JavaScript의 새로운 개인 클래스 필드 및 사용 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.