繁花不似錦
2021-11-12 18:30:14
MDN 文檔說https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain#Inheriting_properties嘗試訪問對象的屬性時,不僅會在對象上查找該屬性,還會在對象的原型、原型的原型等上查找該屬性,直到找到具有匹配名稱的屬性或結束到達原型鏈。這是否意味著當一個屬性被添加到對象時,它會被添加到它的原型中?IE。在下面的代碼中a = {};
a.foo = "hello";實際上存儲為a.prototype.foo = "hello"
3 回答

qq_笑_17
TA貢獻1818條經驗 獲得超7個贊
不。如果您將屬性存儲在對象上,那么您將其存儲在對象上。
它說當您嘗試訪問它(即讀取它,而不是寫入它)時,如果在對象上找不到它,它將查找它的原型鏈。
const a = {};
const b = Object.create(a);
a.foo = "Foo";
console.log(b.foo);

烙印99
TA貢獻1829條經驗 獲得超13個贊
不。
這意味著當搜索一個屬性時,如果它在指定的對象上不存在,則搜索該對象的原型。
如果在該原型上仍未找到該屬性,則它會查看該原型是否具有自己的原型- 然后進行搜索。
重復這個過程,直到找到結果,或者沒有進一步的原型來查找屬性 - 在這種情況下undefined
返回。

Cats萌萌
TA貢獻1805條經驗 獲得超9個贊
不。你甚至不能使用賦值來改變原型值:
const p = Object.create(null);
p.a = "initial value on prototype";
const o = Object.create(p);
console.log(o.a);
o.a = "value set by object";
console.log(o.a);
console.log(p.a);
和這個:
a.prototype.foo = "hello"
不是訪問a的原型。正確的方法是:
Object.getPrototypeOf(a).foo
或不那么正式
a.__proto__.foo
添加回答
舉報
0/150
提交
取消