> 웹 프론트엔드 > JS 튜토리얼 > JavaScript의 프로토타입 배열이 인스턴스 간에 공유되는 이유는 무엇입니까?

JavaScript의 프로토타입 배열이 인스턴스 간에 공유되는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-23 02:19:10
원래의
279명이 탐색했습니다.

Why Do Prototyped Arrays in JavaScript Become Shared Across Instances?

JavaScript의 프로토타입 배열: 인스턴스 간 공유

JavaScript에서 프로토타입을 사용하면 클래스 인스턴스 간에 동작과 데이터를 공유할 수 있습니다. 그러나 배열을 프로토타이핑할 때 고유한 동작이 나타납니다. 즉, 비공개가 아닌 모든 클래스 인스턴스에서 공유됩니다.

프로토타이핑 작동 방식:

객체의 프로토타입 새로운 객체를 생성하기 위한 청사진 역할을 합니다. 프로토타입에 정의된 속성과 메서드는 프로토타입에서 상속받은 모든 개체에서 액세스할 수 있습니다. 이 개념은 인스턴스가 별도의 속성 복사본을 갖는 클래스 기반 언어와 다릅니다.

다음 예에서 Sandwich 클래스는 Sandwich.prototype 객체에서 상속됩니다.

function Sandwich() {

    // Uncomment to fix the problem
    //this.ingredients = [];

}
Sandwich.prototype = {

    "ingredients" : [],
    // ...
};
로그인 후 복사

여기서는 Ingredients 속성은 프로토타입에 정의되어 있습니다. 이는 모든 인스턴스(예: 치즈버거, blt 등)가 동일한 배열을 공유한다는 것을 의미합니다.

공유 배열:

프로토타입 배열의 문제는 하나를 수정한다는 것입니다. 인스턴스의 배열은 다른 모든 배열에 영향을 미칩니다. 이는 질문에 제공된 예에서 볼 수 있듯이 예기치 않은 동작으로 이어질 수 있습니다. Cheeseburger.ingredients 또는 blt.ingredients가 수정되면 Sandwich.prototype에서 상속된 동일한 공유 배열이 변경됩니다.

공유를 피하는 방법:

비공개를 만들려면 각 인스턴스에 대한 배열은 생성자가 아닌 생성자 내에서 속성을 정의합니다. 프로토타입:

function Sandwich() {
    this.ingredients = [];
}
로그인 후 복사

여기서 Ingredients 속성은 새로 생성된 각 인스턴스에 할당되어 다른 인스턴스와 구별되고 격리됩니다.

공유 데이터와 인스턴스별 데이터:

일반적인 규칙은 생성자 내에 인스턴스별 데이터를 할당하고 생성자 내에 공유 데이터(예: 메서드)를 할당하는 것입니다. 프로토타입. 이를 통해 객체 생성 시 액세스를 제어하고 유연성을 확보할 수 있습니다.

추가 참고 사항:

  • 프로토타입 속성은 프로토타입 객체에 대한 포인터를 통해 내부적으로 참조됩니다.
  • 객체의 프로토타입에 접근하는 것은 다음을 사용하여 가능합니다. Object.getPrototypeOf(obj).
  • 이 동작은 JavaScript의 프로토타입 상속에 내재되어 있으며 클래스 기반 언어에는 적용되지 않습니다.

위 내용은 JavaScript의 프로토타입 배열이 인스턴스 간에 공유되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿