> 웹 프론트엔드 > JS 튜토리얼 > Crockford의 프로토타입 상속 패턴에서 중첩된 개체를 덮어쓰는 것이 프로토타입에 영향을 미치는 이유는 무엇입니까?

Crockford의 프로토타입 상속 패턴에서 중첩된 개체를 덮어쓰는 것이 프로토타입에 영향을 미치는 이유는 무엇입니까?

DDD
풀어 주다: 2024-12-09 15:46:11
원래의
202명이 탐색했습니다.

Why Does Overwriting Nested Objects in Crockford's Prototypal Inheritance Pattern Affect the Prototype?

Crockford 프로토타입 상속 패턴의 중첩 객체 문제

Douglas Crockford의 프로토타입 상속 패턴은 내장된 "new" 패턴에 대한 단순화된 대안입니다. 자바스크립트의 키워드. 그러나 사용자가 이 패턴을 사용하여 중첩된 개체에서 상속을 시도할 때 문제가 발생할 수 있습니다.

이 상속 패턴에서는 대상 개체의 프로토타입이 다른 개체로 설정되어 해당 속성을 상속합니다. 대상 객체에서 중첩된 속성을 덮어쓰면 변경 사항이 프로토타입 체인 전체로 전파됩니다. 이 동작은 예상되는 중첩 개체 개념과 일치하지 않습니다.

제공된 예를 고려하십시오.

var nestObj = {
  sex: "female",
  info: {
    firstname: "Jane",
    lastname: "Dough",
    age: 32,
  },
};
var person2 = Object.create(nestObj);
로그인 후 복사

person2.info.age 속성을 덮어쓰면 해당 개체의 연령도 변경됩니다. 프로토타입의 중첩 개체(nestObj.info.age). 이는 예상치 못한 결과일 수 있습니다.

답변에 따르면 이러한 행위는 모순이 아닙니다. 중첩된 객체는 별개의 엔터티로 간주되지 않습니다. 대신, 객체의 자체 속성이거나 프로토타입에서 상속됩니다. 중첩된 개체의 속성 값을 덮어쓰면 고유 속성과 상속된 속성 모두에 영향을 미칩니다.

중첩 속성을 독립적으로 변경하려면 새 개체 참조를 할당해야 합니다.

person2.info = {
  firstname: "Jane",
  lastname: "Dough",
  age: 32,
};
로그인 후 복사

이것은 프로토타입과 독립적인 새로운 중첩 객체를 생성합니다. 이 새 개체의 속성을 덮어써도 프로토타입에는 영향을 미치지 않습니다.

위 내용은 Crockford의 프로토타입 상속 패턴에서 중첩된 개체를 덮어쓰는 것이 프로토타입에 영향을 미치는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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