>웹 프론트엔드 >JS 튜토리얼 >Crockford의 프로토타입 상속은 중첩된 개체를 올바르게 처리합니까?

Crockford의 프로토타입 상속은 중첩된 개체를 올바르게 처리합니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-11 01:49:10259검색

Does Crockford's Prototypal Inheritance Handle Nested Objects Correctly?

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

Douglas Crockford는 자신의 저서 "Javascript: The Good Parts"에서 단순화를 위한 패턴을 제시합니다. 객체 상속. 이 패턴은 기존 프로토타입 객체를 기반으로 새 객체를 생성할 수 있는 Object.create 메서드를 기반으로 합니다.

이 패턴은 플랫 객체에 적합하지만 중첩 객체를 처리할 때 문제가 발생합니다. 이 패턴을 사용하여 상속된 중첩 객체의 값을 덮어쓰면 프로토타입 체인 전체에 걸쳐 중첩 요소에 영향을 미칩니다.

예를 들어 다음 코드에서:

var flatObj = {
  firstname: "John",
  lastname: "Doe",
  age: 23
};
var person1 = Object.create(flatObj);

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

age 속성 변경 person1의 age 속성은 flatObj의 age 속성을 업데이트하지만 person2.info의 age 속성을 변경하면 flatObj의 age 속성이 잘못 업데이트됩니다. NestObj.info.

이 동작은 프로토타입 상속에 내재된 것이 아니라 JavaScript가 중첩 객체를 처리하는 방식에 내재되어 있습니다. JavaScript에서 객체의 속성은 자체 속성(객체 자체에 정의됨)이거나 상속된 속성(프로토타입 체인을 통해 액세스됨)일 수 있습니다. Object.create를 사용하여 객체를 생성하면 해당 프로토타입 객체의 모든 속성을 상속합니다.

이 문제를 방지하려면 중첩된 객체를 새 객체에 명시적으로 할당해야 합니다. 위의 예에서 다음 코드는 person2에 대한 독립적인 정보 개체를 생성합니다.

var person2 = Object.create(nestObj);
person2.info = Object.create(nestObj.info);

중첩 개체를 분리하면 person2의 정보 개체에 대한 변경 사항이 NestObj의 정보 개체에 영향을 주지 않습니다.

위 내용은 Crockford의 프로토타입 상속은 중첩된 개체를 올바르게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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