Natknąłem osobliwością metodą Douglas Crockfords Object.create które mam nadzieję, że ktoś może być w stanie wyjaśnić:JavaScript Object.create - dziedziczenie zagnieżdżone właściwości
Jeśli utworzyć obiektu - powiedzieć " osoba "- używając zapisu literalnego obiektu, użyj Object.create, aby utworzyć nowy obiekt - powiedzmy" anotherPerson "- który dziedziczy metody i właściwości z początkowego obiektu" osoba ".
Jeśli następnie zmienię wartości nazwy drugiego obiektu - "anotherPerson" - zmieni on również wartość nazwy początkowego obiektu "person".
Dzieje się tak tylko wtedy, gdy właściwości są zagnieżdżone, kod ten powinien dać wyobrażenie o tym, co to znaczy:
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'
Gdybym przechowywania wartości nazw bez zagnieżdżania potem to dziwne zachowanie nie występuje - - np
// 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'
ten gniazdowania problem nie wydaje się występować podczas korzystania klasyczny styl dziedziczenia z funkcji konstruktora i „nowych” słowa kluczowego.
Byłbym bardzo wdzięczny, gdyby ktoś mógł wyjaśnić, dlaczego tak się dzieje !?
możliwy duplikat: [Dziedzictwo prototypowe Crockforda - problemy z obiektami zagnieżdżonymi] (http://stackoverflow.com/q/10131052/1048572) – Bergi