国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js面向對象之屏蔽屬性

Pluser / 2789人閱讀

摘要:什么是屏蔽屬性一條賦值語句引出的思考如果對象中包含名為的普通數據訪問屬性,這條賦值語句只會修改已有的屬性值。然而,如果存在于原型鏈上層,賦值語句的行為就會有些不同而且可能很出人意料。總之,不會發生屏蔽。

1.什么是屏蔽屬性

一條賦值語句引出的思考:

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 屬性。

2.屏蔽比我們想象中更加復雜

下面我們分析一下如果foo 不直接存在于myObject 中而是存在于原型鏈上層時myObject.foo = "bar" 會出現的三種情況。

如果在[[Prototype]] 鏈上層存在名為foo 的普通數據訪問屬性并且沒有被標記為只讀(writable:false),那就會直接在myObject 中添加一個名為foo 的新屬性,它是屏蔽屬性。

如果在[[Prototype]] 鏈上層存在foo,但是它被標記為只讀(writable:false),那么無法修改已有屬性或者在myObject 上創建屏蔽屬性。如果運行在嚴格模式下,代碼會拋出一個錯誤。否則,這條賦值語句會被忽略。總之,不會發生屏蔽。

如果在[[Prototype]] 鏈上層存在foo 并且它是一個setter(參見第3 章),那就一定會調用這個setter。foo 不會被添加到(或者說屏蔽于)myObject,也不會重新定義foo 這個setter。

3.你所不知道的屏蔽屬性

大多數開發者都認為如果向[[Prototype]] 鏈上層已經存在的屬性([[Put]])賦值,就一定會觸發屏蔽,但是如你所見,三種情況中只有一種(第一種)是這樣的。
如果你希望在第二種和第三種情況下也屏蔽foo,那就不能使用= 操作符來賦值,而是使用Object.defineProperty(..)(參見第3 章)來向myObject 添加foo。

4.JavaScript中的屬性:定義和賦值的區別

1.賦值可能會調用原型上的setter(sub與sup里面有同名屬性),定義會創建一個自身屬性

2.原型鏈中的同名只讀屬性可能會阻止賦值操作(如上的非屏蔽操作),但不會阻止定義操作

3.賦值運算符不會改變原型鏈上的屬性

4.只有通過定義操作,才能創建一個擁有指定特性的屬性(Object.defineProperty的威力)

5.對象字面量中的屬性是通過定義操作添加的

了解更詳細的信息可以參考:http://www.cnblogs.com/ziyunf...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88102.html

相關文章

  • JS面向對象的程序設計繼承的實現-寄生組合式繼承

    摘要:組合繼承最大的問題就是無論在什么情況下,都會調用兩次超類型構造函數一次是在創建子類型原型的時候。好在,我們已經找到了解決這個問題方法寄生組合式繼承所謂寄生組合式繼承,即通過借用構造函數來繼承屬性,通過原型鏈的混成形式來繼承方法。 寄生組合式繼承 組合繼承是JavaScript最常用的繼承模式。 不過,它也有自己的不足。 組合繼承最大的問題就是無論在什么情況下,都會調用兩次超類型構造函數...

    y1chuan 評論0 收藏0
  • 寫給Java開發者看的JavaScript對象機制

    摘要:如果你已經對機制已有了解,但是由于兩者對象機制的巨大本質差異,對它和構造函數,實例對象的關系仍有疑惑,本文或許可以解答你的問題。所有的原型對象都會自動獲得一個屬性,這個屬性的值是指向原型所在的構造函數的指針。 幫助面向對象開發者理解關于JavaScript對象機制 本文是以一個熟悉OO語言的開發者視角,來解釋JavaScript中的對象。 對于不了解JavaScript 語言,尤其是習...

    Charles 評論0 收藏0
  • javascript面向對象繼承(上)

    摘要:使用原型鏈實現對原型屬性和方法的繼承,用借用構造函數模式實現對實例屬性的繼承。 我們之前介紹了javascript面向對象的封裝的相關內容,還介紹了js的call方法,今天開始討論js的繼承這篇文章參考了《javascript高級程序設計》(第三版),但內容不局限于,網上很多關于js繼承的相關內容都是來自于這本書,有興趣的同學可以翻閱查看 原型鏈繼承 我們先通過一個栗子,了解一下原型鏈...

    ivyzhang 評論0 收藏0
  • 前端進擊的巨人(七):走進面向對象,原型與原型鏈,繼承方式

    摘要:除了以上介紹的幾種對象創建方式,此外還有寄生構造函數模式穩妥構造函數模式。 showImg(https://segmentfault.com/img/remote/1460000018196128); 面向對象 是以 對象 為中心的編程思想,它的思維方式是構造。 面向對象 編程的三大特點:封裝、繼承、多態: 封裝:屬性方法的抽象 繼承:一個類繼承(復制)另一個類的屬性/方法 多態:方...

    wums 評論0 收藏0
  • 面向對象的程序設計原型模式

    摘要:可以用刪除實例對象中自己添加的屬性可以確定屬性是原型中還是實例對象中,當時實例對象中時,返回的是操作符,有兩種使用方式,單獨使用和循環中。單獨使用,通過對象能夠訪問屬性時返回,無論時在原型中還是實例對象中。 原型模式,每個創建的對象都有一個prototype屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含可以由特定類型的所有實例共享的屬性和方法。 ------------...

    yunhao 評論0 收藏0

發表評論

0條評論

Pluser

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<