2 回答

TA貢獻1825條經驗 獲得超4個贊
這就是 JavaScript 的工作原理。當=
用于分配屬性時,引擎將在對象的原型鏈中查找第一個與屬性名稱匹配的屬性描述符。如果找到這樣的描述符,并且該描述符是訪問器(即,具有 setter 和/或 getter),則將調用該 setter。否則,如果描述符是數據描述符,則沒有 setter,新值將分配給實例自己的屬性。
斷言:IsPropertyKey(P) 為 true。
如果 ownDesc 未定義,則
將 ownDesc 設置為 PropertyDescriptor { [[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }。
返回 ?父級。[[設置]](P、V、接收器)。這就是遞歸調用。`ownDesc` 設置為包含此屬性名稱的描述符的第一個祖先。
讓父母成為?O.[[GetPrototypeOf]]()。
如果父級不為空,則
別的,
如果 IsDataDescriptor(ownDesc) 為 true,則
斷言:接收者當前沒有屬性 P。
返回 ?CreateDataProperty(接收器,P,V)。
如果 IsAccessorDescriptor(existingDescriptor) 為 true,則返回 false。
如果existingDescriptor.[[Writable]]為假,則返回假。
令 valueDesc 為 PropertyDescriptor { [[Value]]: V }。
返回 ?接收者。[[DefineOwnProperty]](P, valueDesc)。使用數據描述符,實例(即“接收器”)會獲取分配給它的新值,無論描述符在原型鏈中的哪個位置找到。
如果 ownDesc.[[Writable]] 為 false,則返回 false。
如果 Type(Receiver) 不是 Object,則返回 false。
讓現有描述符是?接收者。[[GetOwnProperty]](P)。
如果existingDescriptor不是未定義的,那么
別的,
斷言:IsAccessorDescriptor(ownDesc) 為 true。
設 setter 為 ownDesc.[[Set]]。
如果 setter 未定義,則返回 false。
履行 ?呼叫(二發手、接發手、“V”)。否則,調用 setter。
返回真。

TA貢獻1895條經驗 獲得超7個贊
當您分配給屬性時,它首先在原型鏈中搜索 setter。如果找到 setter,則簡單地執行它。
如果沒有找到 setter,則會在對象本身中創建或更新普通屬性。分配屬性永遠不會單獨分配給繼承的屬性(setter 可以這樣做)。
添加回答
舉報