我遇到道格拉斯康樂福的Object.create方法,我希望有人也許能夠解釋一個特點:如果我創建一個對象的JavaScript的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'關鍵字的古典風格的繼承時,似乎不會出現這種嵌套問題。
如果有人能夠解釋爲什麼會發生這種情況,我會非常感激!
可能的重複:[克羅克福德的原型繼承 - 嵌套對象的問題](http://stackoverflow.com/q/10131052/1048572) – Bergi 2014-06-08 12:59:55