<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • JavaScript 對象可以做到的三件事

          2020-5-12    seo達(dá)人

          1. 訪問內(nèi)部屬性

          JavaScript 對象無法以常規(guī)方式訪問的內(nèi)部屬性。內(nèi)部屬性名由雙方括號(hào)[[]]包圍,在創(chuàng)建對象時(shí)可用。


          內(nèi)部屬性不能動(dòng)態(tài)地添加到現(xiàn)有對象。


          內(nèi)部屬性可以在某些內(nèi)置 JavaScript 對象中使用,它們存儲(chǔ)ECMAScript規(guī)范指定的內(nèi)部狀態(tài)。


          有兩種內(nèi)部屬性,一種操作對象的方法,另一種是存儲(chǔ)數(shù)據(jù)的方法。例如:


          [[Prototype]] — 對象的原型,可以為null或?qū)ο?

          [[Extensible]] — 表示是否允許在對象中動(dòng)態(tài)添加新的屬性

          [[PrivateFieldValues]] — 用于管理私有類字段

          2. 屬性描述符對象

          數(shù)據(jù)屬性包含了一個(gè)數(shù)據(jù)值的位置,在這個(gè)位置可以讀取和寫入值。也就是說,數(shù)據(jù)屬性可以通過 對象.屬性 訪問,就是我么平常接觸的用戶賦什么值,它們就返回什么,不會(huì)做額外的事情。


          數(shù)據(jù)屬性有4個(gè)描述其行為的特性(為了表示內(nèi)部值,把屬性放在兩對方括號(hào)中),稱為描述符對象。


          屬性 解釋 默認(rèn)值

          [[Configurable]] 能否通過delete刪除屬性從而重新定義屬性;

          能否修改屬性的特性;

          能否把屬性修改為訪問器屬性 true

          [[Enumerable]] 能否通過for-in循環(huán)返回屬性 true

          [[Writable]] 能否修改屬性的值 true

          [[Value]] 包含這個(gè)屬性的數(shù)據(jù)值 undefined

          value 描述符是屬性的數(shù)據(jù)值,例如,我們有以下對象 :


          let foo = {

           a: 1

          }

          那么,a 的value屬性描述符為1。


          writable是指該屬性的值是否可以更改。 默認(rèn)值為true,表示屬性是可寫的。 但是,我們可以通過多種方式將其設(shè)置為不可寫。


          configurable 的意思是可以刪除對象的屬性還是可以更改其屬性描述符。 默認(rèn)值為true,這意味著它是可配置的。


          enumerable 意味著它可以被for ... in循環(huán)遍歷。 默認(rèn)值為true,說明能通過for-in循環(huán)返回屬性


          將屬性鍵添加到返回的數(shù)組之前,Object.keys方法還檢查enumerable 描述符。 但是,Reflect.ownKeys方法不會(huì)檢查此屬性描述符,而是返回所有自己的屬性鍵。


          Prototype描述符有其他方法,get和set分別用于獲取和設(shè)置值。


          在創(chuàng)建新對象, 我們可以使用Object.defineProperty方法設(shè)置的描述符,如下所示:


          let foo = {

           a: 1

          }

          Object.defineProperty(foo, 'b', {

           value: 2,

           writable: true,

           enumerable: true,

           configurable: true,

          });

          這樣得到foo的新值是{a: 1, b: 2}。


          我們還可以使用defineProperty更改現(xiàn)有屬性的描述符。 例如:


          let foo = {

           a: 1

          }

          Object.defineProperty(foo, 'a', {

           value: 2,

           writable: false,

           enumerable: true,

           configurable: true,

          });

          這樣當(dāng)我們嘗試給 foo.a 賦值時(shí),如:


          foo.a = 2;

          如果關(guān)閉了嚴(yán)格模式,瀏覽器將忽略,否則將拋出一個(gè)錯(cuò)誤,因?yàn)槲覀儗?writable 設(shè)置為 false, 表示該屬性不可寫。


          我們還可以使用defineProperty將屬性轉(zhuǎn)換為getter,如下所示:


          'use strict'

          let foo = {

           a: 1

          }


          Object.defineProperty(foo, 'b', {

           get() {

             return 1;

           }

          })

          當(dāng)我們這樣寫的時(shí)候:


          foo.b = 2;

          因?yàn)閎屬性是getter屬性,所以當(dāng)使用嚴(yán)格模式時(shí),我們會(huì)得到一個(gè)錯(cuò)誤:Getter 屬性不能重新賦值。


          3.無法分配繼承的只讀屬性

          繼承的只讀屬性不能再賦值。這是有道理的,因?yàn)槲覀冞@樣設(shè)置它,它是繼承的,所以它應(yīng)該傳播到繼承屬性的對象。


          我們可以使用Object.create創(chuàng)建一個(gè)從原型對象繼承屬性的對象,如下所示:


          const proto = Object.defineProperties({}, {

           a: {

             value: 1,

             writable: false

           }

          })


          const foo = Object.create(proto)

          在上面的代碼中,我們將proto.a的 writable 描述符設(shè)置為false,因此我們無法為其分配其他值。


          如果我們這樣寫:


          foo.a = 2;

          在嚴(yán)格模式下,我們會(huì)收到錯(cuò)誤消息。


          總結(jié)

          我們可以用 JavaScript 對象做很多我們可能不知道的事情。


          首先,某些 JavaScript 對象(例如內(nèi)置瀏覽器對象)具有內(nèi)部屬性,這些屬性由雙方括號(hào)包圍,它們具有內(nèi)部狀態(tài),對象創(chuàng)建無法動(dòng)態(tài)添加。


          JavaScript對象屬性還具有屬性描述符,該屬性描述符使我們可以控制其值以及可以設(shè)置它們的值,還是可以更改其屬性描述符等。


          我們可以使用defineProperty更改屬性的屬性描述符,它還用于添加新屬性及其屬性描述符。


          最后,繼承的只讀屬性保持只讀狀態(tài),這是有道理的,因?yàn)樗菑母冈蛯ο罄^承而來的。

          日歷

          鏈接

          個(gè)人資料

          存檔

          国产成人精品久久亚洲高清不卡| 亚洲国产另类久久久精品黑人| 久久亚洲精品中文字幕| 久久精品国产亚洲av影院| 国产精品久久久久影院嫩草| 丁香久久婷婷国产午夜视频| 亚洲国产精品综合久久一线| 精品无码久久久久久午夜| 国产午夜精品理论片久久| 国产aⅴ激情无码久久| 久久99国产精品久久久| 久久这里的只有是精品23| 成人国内精品久久久久影院| 四虎国产精品成人免费久久| 国产亚洲欧美成人久久片 | 久久亚洲2019中文字幕| 久久久久亚洲AV无码专区首JN| 国产精品99久久免费观看| 久久久久亚洲AV无码专区首JN| 九九热久久免费视频| 狠狠色丁香久久综合五月| 中文字幕人妻色偷偷久久| 色婷婷噜噜久久国产精品12p| 精品蜜臀久久久久99网站| 久久久久久精品久久久久| 久久精品国产亚洲AV不卡| 狠狠色丁香久久综合婷婷| 久久午夜无码鲁丝片| 亚洲综合日韩久久成人AV| 少妇无套内谢久久久久| 亚洲婷婷国产精品电影人久久| 91精品国产综合久久四虎久久无码一级| 久久久久国产精品嫩草影院| 亚洲午夜精品久久久久久浪潮| 狠狠人妻久久久久久综合蜜桃| 99久久精品日本一区二区免费| 久久婷婷五月综合97色一本一本 | 亚洲国产小视频精品久久久三级| 久久精品国产亚洲AV不卡| 精品久久久久久久久久中文字幕 | 精品国产乱码久久久久久郑州公司|