這篇博文的主要目的是爲了填坑,好久以前我發表了一篇名爲關於JavaScript對象中的一切(一) — 對象屬性的文章,想要談一談JavaScript對象,可那時只是貼了一張關於這個主題的思惟導圖,今天我會針對這一主題進行展開,將JavaScript對象一些日常不太經常使用的知識系統的整理出來,方便閱讀者的記憶與理解。在看完本篇文章後,你大可跳轉回這篇博文,並保存思惟導圖,以增強記憶。html
在開始正題以前,讓咱們先憑直覺回憶一下咱們對JavaScript對象的通常認識:函數
以上這些應該是JavaScript開發者對「對象」這一律念最基本的認識。但實際上,JavaScript給予了開發者以更細緻顆粒度操做/設置對象及其屬性的能力,這些能力是什麼?如何運用?這就是接下來咱們要談到的話題。spa
讓咱們保持耐心,再梳理一下對象與屬性的關係:對象是屬性的集合,當對象的屬性是函數時,咱們將其稱之爲「方法」。code
咱們不妨創建這樣的心智模型:對象是一隻藍色的(這裏的顏色特別重要,由於實際上,變量自己也是一隻大章魚,但她的身體倒是紅色的?)大章魚,章魚的每一隻觸手都握着一個屬性的內存地址卡片,當要讀取對象中的屬性時,章魚的觸手會隨着卡片上的地址拿到相應的數據值,並返還給用戶(就是你)。htm
接下來,讓咱們從對象與屬性兩個角度切入,談談一些咱們可能日常不太接觸到的知識。對象
讓咱們先定義這兩個名詞:blog
簡單來講,JavaScript中對象和屬性都「藏」有一些咱們不太經常使用的屬性和方法,咱們的目的就是揪出它們,分析它們的用法和意義,而後對JavaScript對象有一個完整清晰的認識。繼承
讓咱們先從JavaScript對象的內部方法提及:ip
JavaScript對象有如下三個內部方法:內存
[[Put]]
:用來建立對象屬性,當新建對象屬性時被調用,就像命令藍色章魚長出一隻觸角,握住一張內存地址卡片;[[Set]]
:用來修改對象屬性的值,當修改對象屬性時被調用,能夠想象爲命令藍色章魚的某個觸角放下已有的內存地址卡片,改換另外一張;[[Delete]]
:用來刪除對象屬性的值,當使用delete
關鍵字刪除對象屬性時被調用,能夠想象爲砍掉藍色章魚的一隻觸角(別擔憂,藍色章魚並不在乎);講到這裏咱們能夠很好的說明當設定某對象屬性值爲null
時會發生什麼了,那隻藍色章魚的觸角還在,只是拿了一張空白卡片!
let obj1 = { x: null, } console.log(obj1.x) // null let obj2 = { y: null, } delete obj2.y console.log(obj.y) // undefined(當訪問對象不存在的屬性時,一概獲得undefined值)
接着咱們來談談對象的特徵屬性。
很遺憾對象的特徵屬性並不如屬性那麼多,咱們這裏先介紹一個,名爲:[[Extensible]]
,它的值是一個布爾值,用來表示對象自己是否能夠被修改,簡單來講,即是是否能夠添加屬性(實際上,還有一個內部的[[proto]]
特徵屬性)。
爲了配置這個屬性,JavaScript給了咱們一個專門的方法:Object.preventExtensions()
,同時,爲了檢測一個對象是不是可擴展的,JavaScript還給咱們提供了Object.isExtensible()
方法,讓咱們看看它們的用法:
let obj = { x: 1, } console. log(Object.isExtensible(obj)) // true Object.preventExtensions(obj) console.log(Object.isExtensible(obj)) // false obj.y = 2 console.log('y' in obj) //false
可見,經過這個特徵屬性,咱們能夠建立一個比較保守的不可擴展對象,當咱們瞭解屬性的特徵屬性後,在本文最後你會看到,咱們最終是如何製造出一個封閉性極強的對象的(不只不可擴展,連屬性也不能被改變)。
讓咱們小結一下:JavaScript對象有三個內部方法和一個特徵屬性,他們分別是:
[[Put]]
,[[Set]]
,[[Delete]]
;[[Extensible]]
;在下一篇文章中,咱們會一塊兒梳理對象屬性的一些鮮爲人知的小祕密,休息一下,而後咱們繼續。
? Hey!喜歡這篇文章嗎?別忘了在下方? 點贊讓我知道。