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 중국어 웹사이트의 기타 관련 기사를 참조하세요!