Прототипное наследование Крокфорда - проблемы с вложенными объектами

Я "читал" 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>

(также наиграть на скрипке)

Я делаю что-то не так, или это ограничение этого шаблона?

Ответы на вопрос(3)

Ваш ответ на вопрос