如何理解原型鏈中的setter和屬性遮蔽之間的關係?

時間 2021-06-03 05:21:37

1樓:卓怡

這個問題我弄明白了,自己回答一下吧

varanotherObject=,

getb(),

a:2};

varmyObject

=Object

.create

(anotherObject

);對myObject操作

myObject.a

=7;呼叫了setter,但是myObject.a 的仍然是7但是如果對c操作的話,a 的值就會發生變化myObject.c=7;

2樓:pawn

在為this.a 賦值的時候,此時this.a 已經被賦值了。

資料劫持並不是阻礙給this.a 賦值, 而是在賦值時允許你進行一定的行為 。 當進行資料劫持時,getter 通常不會返回this.

a, 常常是乙個閉包或者私有變數。 可以參考vue 在處理資料依賴的原始碼,就是典型的屬性劫持和閉包儲存。

在c# 3.0 以前的版本中的常規屬性:

public

class

Person

set}

}set & get 中有return,所以本質是函式 。在3.0 之後, 新增自動屬性語法糖:

public

class

Person

}那麼,自動屬性的本質就是函式的呼叫 .

回到js , setter 和 getter 本質就是定義在物件上的函式 . 根據屬性遮蔽原則, 當myObject本身沒有getter 和 setter 時, 會去原型鏈中尋找. 當呼叫原型鏈anotherObject中的setter函式時,this 則是myObject物件本身。

為this.a 賦值時, 就一定會賦到myObject 上。 當getter 時, 由於 myObject 本身已經有a屬性了,自然就返回 7 。

這也就解答了題注的疑惑, 這樣設計也是非常合理的 。

3樓:紫雲飛

你的問題不明確,我不會回答。不過我有個小問題想說,就是你說的這個術語「屬性遮蔽」。

我雖然沒有看過這本書,但我猜「屬性遮蔽」的英文原文應該是「Property Shadowing」吧,這個術語翻譯成「屬性遮蔽」更合適,"遮蔽"對應的單詞是 shielding。

我若干年前在 MDN 文件繼承與原型鏈中也是這麼翻譯的。

怎麼理解JS原型鏈中Function原型物件的 proto 指向Object的原型物件?

冷月騎士 不僅如此,Function.constructor Function 也是成立的,加上你的問題,也就是下圖中紅線部分,都是成立的。非常直觀的說明了以下問題 1.JS中,一切皆物件 任何乙個值,不管是什麼型別,最後都能鏈路到 Object 2.函式是一等公民 畢竟Object 型別,也是通過...

js 原型鏈怎麼理解?

江南公子旭 function animal function dog animal.price 2000 dog.prototype animal 解 因為這裡這是將這個函式的prototype屬性賦值成了 animal 並不是他 new 出來的乙個物件 所以animal 不是他的建構函式 所以do...

如何簡單快速的理解區塊鏈?

哈密瓜 為了給你乙個簡單易懂的例子,你可以很快理解區塊鏈是什麼 乙個村子裡,A花了3000塊買了B的一頭牛,這筆帳目怎麼記呢?因此,A和B發現了乙個共同的信任C來記錄帳戶,但後來A和C串通,並且不承認乙個被收購的B牛,所以交易是乙個粗糙的問題,爭論繼續。後來,B又生了一頭奶牛。當然,她沒有把它賣給A...