Crockford의 프로토타입 상속: 중첩 객체 문제
Douglas Crockford의 프로토타입 상속 패턴은 그의 저서 "Javascript: The Good Parts"에 설명되어 있습니다. 객체 상속을 단순화하고 "new" 키워드와 관련된 혼동을 방지합니다. 그러나 이 패턴을 사용하여 중첩된 개체에서 상속을 시도하면 문제가 발생합니다. 중첩된 개체 속성을 덮어쓰면 전체 프로토타입 체인에 영향을 줍니다.
다음 코드를 고려하세요.
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); var nestObj2 = { sex: "male", info: { firstname: "Arnold", lastname: "Schwarzenneger", age: 61 } } var person3 = { sex: "male" } person3.info = Object.create(nestObj2.info); // now change the objects: person1.age = 69; person2.info.age = 96; person3.info.age = 0; // prototypes should not have changed: flatObj.age // 23 nestObj.info.age // 96 ??? nestObj2.info.age // 61 // now delete properties: delete person1.age; delete person2.info.age; delete person3.info.age; // prototypes should not have changed: flatObj.age // 23 nestObj.info.age // undefined ??? nestObj2.info.age // 61
여기서 예를 들어, 중첩된 객체 NestObj에서 상속한 후 person2에서 중첩된 객체의 속성을 변경하면 프로토타입 NestObj에 영향을 미치며, person3의 중첩 객체에도 유사하게 적용됩니다. 이는 예상치 못한 동작이며 개별 개체에 대한 변경 사항을 격리하려는 패턴의 의도된 목적을 훼손합니다.
이러한 불일치의 이유는 JavaScript 개체 상속의 기본 특성에 있습니다. 객체가 다른 객체로부터 상속되면 독립적인 복사본을 만드는 대신 해당 객체의 속성에 대한 참조를 만듭니다. 즉, 상속된 속성에 대한 모든 변경 사항은 하위 개체와 프로토타입 모두에 반영됩니다.
이 문제를 방지하려면 중첩된 속성을 상속하기 전에 중첩된 속성에 대한 새 개체를 명시적으로 생성해야 합니다. 이렇게 하면 중첩된 속성에 대한 변경 사항이 하위 개체에 격리됩니다. 따라서 올바른 코드는 다음과 같습니다.
person3.info = Object.create(nestObj2.info); // Create a new object for the nested property person3.info.age = 0; // Change the age property without affecting the prototype
위 내용은 Crockford의 프로토타입 상속은 중첩된 객체와 속성 수정을 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!