>웹 프론트엔드 >JS 튜토리얼 >JavaScript 객체 멤버는 배열 공유 또는 비공개로 프로토타입화됩니까?

JavaScript 객체 멤버는 배열 공유 또는 비공개로 프로토타입화됩니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-14 18:43:021041검색

Are JavaScript Object Members Prototyped as Arrays Shared or Private?

배열로 프로토타입화된 JavaScript 객체 멤버: 공유 또는 비공개?

JavaScript에서 객체 속성은 객체에 직접 정의하거나 객체의 속성으로 정의할 수 있습니다. 객체의 프로토타입. 이 동작은 배열을 다룰 때 중요한 의미를 갖습니다.

기본적으로 프로토타입 배열은 클래스의 모든 인스턴스에서 공유되므로 예기치 않은 동작이 발생합니다. 예를 들어, 클래스의 프로토타입에 빈 배열이 포함되어 있으면 모든 인스턴스가 동일한 배열을 참조합니다. 이는 다음 예에서 확인할 수 있습니다.

function Sandwich() {
  // Uncomment to fix the problem
  //this.ingredients = [];
}

Sandwich.prototype = {
  "ingredients": [],
  "addIngredients": function(ingArray) {
    for(var key in ingArray) {
      this.addIngredient(ingArray[key]);
    }
  },
  "addIngredient": function(thing) {
    this.ingredients.push(thing);
  }
};

var cheeseburger = new Sandwich();
cheeseburger.addIngredients(["burger", "cheese"]);

var blt = new Sandwich();
blt.addIngredients(["bacon", "lettuce", "tomato"]);

print_r("Cheeseburger contains:", cheeseburger.ingredients);

이 예에서 Cheeseburger와 blt는 서로 다른 인스턴스임에도 불구하고 동일한 재료 배열을 공유합니다. 치즈버거에 재료를 추가하면 blt에도 영향을 미쳐 배열의 공유 특성이 강조됩니다.

이 동작을 수정하려면 프로토타입 속성이 아닌 개체 자체에 직접 배열을 정의하는 것이 좋습니다. 이렇게 하면 각 인스턴스가 고유한 전용 배열을 갖게 됩니다. 다음과 같이 코드를 수정하면 문제가 해결됩니다.

function Sandwich() {
  this.ingredients = [];
}

생성자에서 배열을 정의하면 Sandwich의 각 인스턴스가 고유한 배열 복사본을 가지게 되어 공유 동작이 제거됩니다.

요약하자면, 프로토타입 배열은 JavaScript에서 클래스의 모든 인스턴스 간에 공유됩니다. 각 인스턴스에 대한 전용 배열을 만들려면 생성자에서 개체 자체에 직접 배열을 정의해야 합니다. 이러한 구별은 JavaScript의 객체 동작을 이해하고 관리하는 데 매우 중요합니다.

위 내용은 JavaScript 객체 멤버는 배열 공유 또는 비공개로 프로토타입화됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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