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

資訊專欄INFORMATION COLUMN

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

vincent_xyb / 3332人閱讀

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

1 [[Prototype]]

對(duì)于默認(rèn)的 [[Get]] 操作來(lái)說(shuō),如果無(wú)法在對(duì)象本身找到需要的屬性,就會(huì)繼續(xù)訪問(wèn)對(duì)象的 [[Prototype]] 鏈

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

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

屬性屏蔽

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

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

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

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

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

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

如果在[[Prototype]]鏈上層存在foo,但是它被標(biāo)記為只讀(writable:false),那么無(wú)法修改已有屬性或者在 myObject 上創(chuàng)建屏蔽屬性。如果運(yùn)行在嚴(yán)格模式下,代碼會(huì)拋出一個(gè)錯(cuò)誤。否則,這條賦值語(yǔ)句會(huì)被忽略??傊?,不會(huì)發(fā)生屏蔽。

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

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

2 “類”

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

類關(guān)系

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

1 foo instanceof Foo

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

2 Foo.prototype.isPrototypeOf( foo )

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

?

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

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

相關(guān)文章

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

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

    AndroidTraveler 評(píng)論0 收藏0
  • 你不知道javascript》筆記_對(duì)象&原型

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

    seasonley 評(píng)論0 收藏0
  • 你不知道JS上》筆記

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

    VPointer 評(píng)論0 收藏0
  • 筆記-你不知道JS-對(duì)象

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

    senntyou 評(píng)論0 收藏0
  • JS筆記

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

    rottengeek 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<