關於JavaScript對象,你所不知道的事(一)- 先談對象

這篇博文的主要目的是爲了填坑,好久以前我發表了一篇名爲關於JavaScript對象中的一切(一) — 對象屬性的文章,想要談一談JavaScript對象,可那時只是貼了一張關於這個主題的思惟導圖,今天我會針對這一主題進行展開,將JavaScript對象一些日常不太經常使用的知識系統的整理出來,方便閱讀者的記憶與理解。在看完本篇文章後,你大可跳轉回這篇博文,並保存思惟導圖,以增強記憶。html

對於對象的通常認識

在開始正題以前,讓咱們先憑直覺回憶一下咱們對JavaScript對象的通常認識:bash

  1. 對象是一個引用類型值;
  2. 建立對象的方式有兩種形式:「字面量形式」與「構造函數形式」;
  3. 對象的屬性能夠隨時修改,且一旦改動,全部引用對象的地方,其屬性值均會被改變(這也是引用類型的特色);
  4. 對象能夠經過原型鏈實現繼承;

以上這些應該是JavaScript開發者對「對象」這一律念最基本的認識。但實際上,JavaScript給予了開發者以更細緻顆粒度操做/設置對象及其屬性的能力,這些能力是什麼?如何運用?這就是接下來咱們要談到的話題。函數


對象與屬性

讓咱們保持耐心,再梳理一下對象與屬性的關係:對象是屬性的集合,當對象的屬性是函數時,咱們將其稱之爲「方法」ui

咱們不妨創建這樣的心智模型:對象是一隻藍色的(這裏的顏色特別重要,由於實際上,變量自己也是一隻大章魚,但她的身體倒是紅色的🐙)大章魚,章魚的每一隻觸手都握着一個屬性的內存地址卡片,當要讀取對象中的屬性時,章魚的觸手會隨着卡片上的地址拿到相應的數據值,並返還給用戶(就是你)。spa

接下來,讓咱們從對象與屬性兩個角度切入,談談一些咱們可能日常不太接觸到的知識。code


對象的內部方法與特徵屬性

讓咱們先定義這兩個名詞:cdn

  • 內部方法是指:JavaScript於對象內部定義的,用戶不可訪問/修改的方法;
  • 特徵屬性是指:用來描述對象/屬性一些特性(如是否可配置?是否可迭代)的屬性;

簡單來講,JavaScript中對象和屬性都「藏」有一些咱們不太經常使用的屬性和方法,咱們的目的就是揪出它們,分析它們的用法和意義,而後對JavaScript對象有一個完整清晰的認識。htm

讓咱們先從JavaScript對象的內部方法提及:對象

JavaScript對象有如下三個內部方法:blog

  1. [[Put]]:用來建立對象屬性,當新建對象屬性時被調用,就像命令藍色章魚長出一隻觸角,握住一張內存地址卡片;
  2. [[Set]]:用來修改對象屬性的值,當修改對象屬性時被調用,能夠想象爲命令藍色章魚的某個觸角放下已有的內存地址卡片,改換另外一張;
  3. [[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對象有三個內部方法和一個特徵屬性,他們分別是:

  1. 內置方法:[[Put]][[Set]][[Delete]]
  2. 特徵屬性:[[Extensible]]

在下一篇文章中,咱們會一塊兒梳理對象屬性的一些鮮爲人知的小祕密,休息一下,而後咱們繼續。

👋 Hey!喜歡這篇文章嗎?別忘了在下方👇 點贊讓我知道。

相關文章
相關標籤/搜索