成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

筆記-你不知道的JS-原型

AndroidTraveler / 585人閱讀

摘要:如果存在于原型鏈上層,賦值語句的行為就會有些不同。中包含的屬性會屏蔽原型鏈上層的所有屬性,因為總是會選擇原型鏈中最底層的屬性。如果不直接存在于中而是存在于原型鏈上層時會出現(xiàn)的三種情況。類構(gòu)造函數(shù)原型函數(shù),兩個函數(shù)通過屬性和屬性相關(guān)聯(lián)。

1 [[Prototype]]

對于默認的 [[Get]] 操作來說,如果無法在對象本身找到需要的屬性,就會繼續(xù)訪問對象的 [[Prototype]] 鏈

所有普通的 [[Prototype]] 鏈最終都會指向內(nèi)置的 Object.prototype。由于所有的“普通”(內(nèi)置,不是特定主機的擴展)對象都“源于”(或者說把 [[Prototype]] 鏈的頂端設置為)這個 Object.prototype 對象,如:toString,valueOf,hasOwnProperty,isPrototypeOf

var anotherObject = { a:2};
// 創(chuàng)建一個關(guān)聯(lián)到 anotherObject 的對象
var myObject = Object.create( anotherObject ); 
// myObject = { __proto__: {  a:2, __proto__: Object}};
myObject.a; // 2

屬性屏蔽

給一個對象設置屬性并不僅僅是添加一個新屬性或者修改已有的屬性值,如myObject.foo = "bar";

如果 myObject 對象中包含名為 foo 的普通數(shù)據(jù)訪問屬性,這條賦值語句只會修改已有的屬性值。

如果 foo 存在于原型鏈上層,賦值語句 myObject.foo = "bar" 的行為就會有些不同。

如果屬性名 foo 既出現(xiàn)在 myObject 中也出現(xiàn)在 myObject 的 [[Prototype]] 鏈上層,那么就會發(fā)生屏蔽。myObject 中包含的 foo 屬性會屏蔽原型鏈上層的所有 foo 屬性,因為myObject.foo 總是會選擇原型鏈中最底層的 foo 屬性。

如果 foo 不直接存在于 myObject 中而是存在于原型鏈上層時 myObject.foo = "bar" 會出現(xiàn)的三種情況。

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

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

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

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

2 “類”

構(gòu)造函數(shù)+原型函數(shù),兩個函數(shù)通過 constructor 屬性和 prototype 屬性相關(guān)聯(lián)。

類關(guān)系

function Foo() {}
let foo = new Foo();

1 foo instanceof Foo

instanceof 操作符的左操作數(shù)是一個普通的對象,右操作數(shù)是一個函數(shù)。instanceof 回答的問題是:在 a 的整條 [[Prototype]] 鏈中是否有指向 Foo.prototype 的對象

2 Foo.prototype.isPrototypeOf( foo )

isPrototypeOf(..) 回答的問題是:在 foo 的整條 [[Prototype]] 鏈中是否出現(xiàn)過 Foo.prototype 。我們也可以直接獲取一個對象的 [[Prototype]] 鏈。Object.getPrototypeOf(foo); 如Object.getPrototypeOf( foo ) === Foo.prototype; // true 或者 a.__proto__ === Foo.prototype; // true

?

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/104374.html

相關(guān)文章

  • 筆記-你不知道JS-原型

    摘要:如果存在于原型鏈上層,賦值語句的行為就會有些不同。中包含的屬性會屏蔽原型鏈上層的所有屬性,因為總是會選擇原型鏈中最底層的屬性。如果不直接存在于中而是存在于原型鏈上層時會出現(xiàn)的三種情況。類構(gòu)造函數(shù)原型函數(shù),兩個函數(shù)通過屬性和屬性相關(guān)聯(lián)。 1 [[Prototype]] 對于默認的 [[Get]] 操作來說,如果無法在對象本身找到需要的屬性,就會繼續(xù)訪問對象的 [[Prototype]] ...

    vincent_xyb 評論0 收藏0
  • 你不知道javascript》筆記_對象&原型

    摘要:上一篇你不知道的筆記寫在前面這是年第一篇博客,回顧去年年初列的學習清單,發(fā)現(xiàn)僅有部分完成了。當然,這并不影響年是向上的一年在新的城市穩(wěn)定連續(xù)堅持健身三個月早睡早起游戲時間大大縮減,學會生活。 上一篇:《你不知道的javascript》筆記_this 寫在前面 這是2019年第一篇博客,回顧去年年初列的學習清單,發(fā)現(xiàn)僅有部分完成了。當然,這并不影響2018年是向上的一年:在新的城市穩(wěn)定、...

    seasonley 評論0 收藏0
  • 你不知道JS上》筆記

    摘要:隱式綁定即綁定到最頂層或最近調(diào)用對象上顯式綁定即用或手動進行綁定方法實現(xiàn)綁定構(gòu)造函數(shù)不存在其實在中不存在構(gòu)造函數(shù),我們所說的構(gòu)造函數(shù)其實就是普通的函數(shù),它只是用被構(gòu)造調(diào)用而已。 JS是編譯型語言 編譯發(fā)生在代碼執(zhí)行前幾微秒,簡單來說就是js在執(zhí)行前要進行編譯,編譯過程發(fā)生在代碼執(zhí)行前幾微妙,甚至更短。 編譯的步驟 詞法分析以var a = 2 為例,詞法分析會將其分成三個有意義的代碼...

    VPointer 評論0 收藏0
  • 筆記-你不知道JS-對象

    摘要:內(nèi)置對象,在中,它們實際上只是一些內(nèi)置函數(shù)。這些內(nèi)置函數(shù)可以當作構(gòu)造函數(shù),使用調(diào)用,產(chǎn)生新對象。在必要時語言會自動把字符串字面量轉(zhuǎn)換成一個對象,也就是說你并不需要顯式創(chuàng)建一個對象。屬性操作符要求屬性名滿足標識符的命名規(guī)范。 1 如何定義 // 聲明形式,大部分情況下使用聲明形式 let obj ={ a:2, b:3 }; // 構(gòu)造形式 let obj= = new Obje...

    senntyou 評論0 收藏0
  • JS筆記

    摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。異步編程入門的全稱是前端經(jīng)典面試題從輸入到頁面加載發(fā)生了什么這是一篇開發(fā)的科普類文章,涉及到優(yōu)化等多個方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結(jié)思考,循序漸進的理解 TypeScript。 網(wǎng)絡基礎知識之 HTTP 協(xié)議 詳細介紹 HTT...

    rottengeek 評論0 收藏0

發(fā)表評論

0條評論

AndroidTraveler

|高級講師

TA的文章

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