Прототипное наследование Крокфорда - проблемы с вложенными объектами
Я "читал" Javascript: The Good Parts " Дугласом Крокфордом - и хотя это немного экстремально, я нахожусь на борту с большим количеством того, что он должен сказать.
В главе 3 он обсуждает объекты и в какой-то момент излагает шаблон (такженашел здесь) для упрощения & amp; Избегать путаницы / проблем, возникающих при использовании встроенного «нового» ключевое слово.
<code>if (typeof Object.create !== 'function') { Object.create = function (o) { function F() {} F.prototype = o; return new F(); }; } newObject = Object.create(oldObject); </code>
Итак, я попытался использовать это в проекте, над которым я работаю, и заметил проблему при попытке наследования от вложенных объектов. Если я перезаписываю значение вложенного объекта, унаследованного с использованием этого шаблона, он перезаписывает вложенный элемент на протяжении всей цепочки прототипов.
Пример Крокфорда подобенflatObj
в следующем примере, который работает хорошо. Поведение, однако, несовместимо с вложенными объектами:
<code>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 </code>
(также наиграть на скрипке)
Я делаю что-то не так, или это ограничение этого шаблона?