亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

原型中的 Setter 屬性與數據屬性

原型中的 Setter 屬性與數據屬性

POPMUISE 2023-07-29 14:51:56
有人可以解釋以下行為嗎?var p = {  name: "John",  set age(value) {    console.log("Age set to", value);  }}var obj = {};Object.setPrototypeOf(obj, p);obj.name = "Jill"; // Doesn't alter the name on prototype, creates a new property on objobj.age = 22; // Calls the setter on prototype為什么分配 to 會age調用原型上的 setter,而分配 toname會在 上創建新屬性obj?
查看完整描述

2 回答

?
鳳凰求蠱

TA貢獻1825條經驗 獲得超4個贊

這就是 JavaScript 的工作原理。當=用于分配屬性時,引擎將在對象的原型鏈中查找第一個與屬性名稱匹配的屬性描述符。如果找到這樣的描述符,并且該描述符是訪問器(即,具有 setter 和/或 getter),則將調用該 setter。否則,如果描述符是數據描述符,則沒有 setter,新值將分配給實例自己的屬性。

  1. 斷言:IsPropertyKey(P) 為 true。

  2. 如果 ownDesc 未定義,則

    1. 將 ownDesc 設置為 PropertyDescriptor { [[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }。

    2. 返回 ?父級。[[設置]](P、V、接收器)。這就是遞歸調用。`ownDesc` 設置為包含此屬性名稱的描述符的第一個祖先。

    3. 讓父母成為?O.[[GetPrototypeOf]]()。

    4. 如果父級不為空,則

    5. 別的,

  3. 如果 IsDataDescriptor(ownDesc) 為 true,則

    1. 斷言:接收者當前沒有屬性 P。

    2. 返回 ?CreateDataProperty(接收器,P,V)。

    3. 如果 IsAccessorDescriptor(existingDescriptor) 為 true,則返回 false。

    4. 如果existingDescriptor.[[Writable]]為假,則返回假。

    5. 令 valueDesc 為 PropertyDescriptor { [[Value]]: V }。

    6. 返回 ?接收者。[[DefineOwnProperty]](P, valueDesc)。使用數據描述符,實例(即“接收器”)會獲取分配給它的新值,無論描述符在原型鏈中的哪個位置找到。

    7. 如果 ownDesc.[[Writable]] 為 false,則返回 false。

    8. 如果 Type(Receiver) 不是 Object,則返回 false。

    9. 讓現有描述符是?接收者。[[GetOwnProperty]](P)。

    10. 如果existingDescriptor不是未定義的,那么

    11. 別的,

  4. 斷言:IsAccessorDescriptor(ownDesc) 為 true。

  5. 設 setter 為 ownDesc.[[Set]]。

  6. 如果 setter 未定義,則返回 false。

  7. 履行 ?呼叫(二發手、接發手、“V”)。否則,調用 setter。

  8. 返回真。


查看完整回答
反對 回復 2023-07-29
?
人到中年有點甜

TA貢獻1895條經驗 獲得超7個贊

當您分配給屬性時,它首先在原型鏈中搜索 setter。如果找到 setter,則簡單地執行它。

如果沒有找到 setter,則會在對象本身中創建或更新普通屬性。分配屬性永遠不會單獨分配給繼承的屬性(setter 可以這樣做)。


查看完整回答
反對 回復 2023-07-29
  • 2 回答
  • 0 關注
  • 163 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號