一條賦值語句引出的思考:html
myObject.foo = "bar";
若是myObject 對象中包含名爲foo 的普通數據訪問屬性,這條賦值語句只會修改已有的屬
性值。
若是foo 不是直接存在於myObject 中,[[Prototype]] 鏈就會被遍歷,相似[[Get]] 操做。
若是原型鏈上找不到foo,foo 就會被直接添加到myObject 上。
然而,若是foo 存在於原型鏈上層,賦值語句myObject.foo = "bar" 的行爲就會有些不一樣
(並且可能很出人意料)。稍後咱們會進行介紹。
若是屬性名foo 既出如今myObject 中也出如今myObject 的[[Prototype]] 鏈上層, 那
麼就會發生屏蔽。myObject 中包含的foo 屬性會屏蔽原型鏈上層的全部foo 屬性,由於
myObject.foo 老是會選擇原型鏈中最底層的foo 屬性。code
下面咱們分析一下若是foo 不直接存在於myObject 中而是存在於原型鏈上層時myObject.foo = "bar" 會出現的三種狀況。htm
大多數開發者都認爲若是向[[Prototype]] 鏈上層已經存在的屬性([[Put]])賦值,就必定會觸發屏蔽,可是如你所見,三種狀況中只有一種(第一種)是這樣的。
若是你但願在第二種和第三種狀況下也屏蔽foo,那就不能使用= 操做符來賦值,而是使用Object.defineProperty(..)(參見第3 章)來向myObject 添加foo。對象
1.賦值可能會調用原型上的setter(sub與sup裏面有同名屬性),定義會建立一個自身屬性blog
2.原型鏈中的同名只讀屬性可能會阻止賦值操做(如上的非屏蔽操做),但不會阻止定義操做ip
3.賦值運算符不會改變原型鏈上的屬性原型鏈
4.只有經過定義操做,才能建立一個擁有指定特性的屬性(Object.defineProperty的威力)開發
5.對象字面量中的屬性是經過定義操做添加的get
瞭解更詳細的信息能夠參考:http://www.cnblogs.com/ziyunf...原型