Я столкнулся с особенностью метода Дугласа Крокфорда Object.create, который, я надеюсь, кто-то сможет объяснить:
Если я создаю объект - скажем, «человек» - используя буквенное обозначение объектазатем используйте Object.create для создания нового объекта - скажем, «anotherPerson» - который наследует методы и свойства от исходного объекта «person».
Если я затем изменю значения имени второго объекта - 'anotherPerson'- это также меняет значение имени исходного объекта' person '.
Это происходит только тогда, когда свойства вложены, этот код должен дать вам представление о том, что я имею в виду:
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
};
// initiate new 'person' object
var person = {
name: {
first: 'Ricky',
last: 'Gervais'
},
talk: function() {
console.log('my name is ' + this.name.first + ' ' + this.name.last);
}
}
// create anotherPerson from person.prototype
var anotherPerson = Object.create(person);
// change name of anotherPerson
anotherPerson.name.first = 'Stephen';
anotherPerson.name.last = 'Merchant';
// call talk method of both 'person' and 'anotherPerson' objects
person.talk(); // oddly enough, prints 'Stephen Merchant'
anotherPerson.talk(); // prints 'Stephen Merchant'
Если бы я должен был хранить значения имен без вложенности, то такого странного поведения не возникало бы - например,
// initiate new 'person' object
var person = {
firstName: 'Ricky',
lastName: 'Gervais',
talk: function() {
console.log('my name is ' + this.firstName + ' ' + this.lastName);
}
}
// create anotherPerson from person.prototype
var anotherPerson = Object.create(person);
// change name of anotherPerson
anotherPerson.firstName = 'Stephen';
anotherPerson.lastName = 'Merchant';
// call talk method of both 'person' and 'anotherPerson' objects
person.talk(); // prints 'Ricky Gervais'
anotherPerson.talk(); // prints 'Stephen Merchant'
Эта проблема с вложенностью, кажется, не возникает при использовании классического стиля наследования с конструктором.функция и ключевое слово 'new'.
Буду очень признателен, если кто-нибудь сможет объяснить, почему это происходит!?