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