iT邦幫忙

2022 iThome 鐵人賽

DAY 18
0
Modern Web

想轉職的鯊魚從零基礎開始學習JavaScript系列 第 18

想轉職的鯊魚從零基礎開始學習JavaScript Day-18 Fundamental Objects(一)-Object Objects (名為物件的物件)

  • 分享至 

  • xImage
  •  

前言

在鯊魚先前的認知中常用的物件有三個,分別是Object Function跟Array三種,這三個應該就是物件的基礎了,但是應該僅是個人的推測,我們要秉持著有多少資訊說多少話語,於是我去看看ECMA的分類,剛剛說的三個在ECMA中被分為兩類,分別是屬於Fundamental Objects(基礎物件)的Object跟Function,以及屬於Indexed Collections(索引集合)的Array。
Fundamental Objects(基礎物件),顧名思義Fundamental就是基礎,鯊魚秉持著學習一定要將基礎打好的精神,讓我們從基礎開始深入了解物件吧。
鯊語錄

概述

先前有簡略的帶過一次,物件的本質是將輸入的key轉換成一個value。

Object constructor(物件建構式)

在Global Object中有一個"Object" property,這個就是物件的原型建構式,創立一個新物件的時候都會繼承這個constructor(建構式),而正因為有constructor(建構式),創立新物件的可以透過new去執行。

let shark = new Object();
shark
// {} 創立一個新的空物件

The Property Descriptor Specification Type

Property Descriptor(屬性描述器)用於解釋物件的操作和具體化。
像是值的異動與刪除。

屬性描述器有下面六種

  • value: 屬性的值
  • writable: 屬性是否能異動,就像是檔案的唯獨屬性與否,如果是true就不是唯獨,可以被修改,若是false就是唯獨,不能被修改。
  • enumerable: 定義物件是否能用 for-in 語法來迭代。
  • configurable: 定義上面的屬性是否可以更動其值,預設是true,若為fales則不能更動上面的屬性
  • get: 物件的get函式,一個特別的讀取值的方式。
  • set: 物件的set函式,一個特別的修改值的方式。

Object的Properties有一部份跟Property Descriptor有關係,這邊先概略說一下。

Properties of the Object Constructor

  • Object.assign ( target, ...sources )
    target表示一個物件,
    ...sources表示一個或是多個物件
    將多個物件結合在一起,並生成一個新物件,如果有同樣的key,會以後面的sources 的value為主
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 }; // key b跟target的 b重複了
const source2 = { b: 6, d: 6 }; // key b 跟前面兩個重複了

console.log(Object.assign(target, source, source2));
// Object { a: 1, b: 6, c: 5, d: 6 } 
// 以最後的source2 為主
  • Object.create ( O, Properties )

    O表示一個物件
    新創立的物件並可以可以調用O裡面所有的Properties。
    也就是以O為原型,創建一個物件

  • Object.defineProperties ( O, Properties )

    對物件O的一個Property Descriptor(屬性描述器)做修改。

  • Object.defineProperty ( O, P, Attributes )

    對物件O的多個Property Descriptor(屬性描述器)做修改。

  • Object.entries ( O )

    將物件的各組key跟value化成一個個的Array
    常跟for...in一起用,將其逐一取出

  • Object.freeze ( O )

    將物件O凍結,使其不能做任何修改

  • Object.fromEntries ( iterable )

    是entries的反向操作,將一組組的[key,value]轉成一個物件。

  • Object.getOwnPropertyDescriptor ( O, P )

    創建一個新物件,並將O的一個Property Descriptor(屬性描述器)變成自己的設定。

  • Object.getOwnPropertyDescriptors ( O )

    創建一個新物件,並將O的全部的Property Descriptor(屬性描述器)變成自己的設定。

  • Object.getOwnPropertyNames ( O )

    將物件O所有的key化作陣列輸出。

  • Object.getOwnPropertySymbols ( O )

    跟getOwnPropertyNames類似,但是key的type必須是Symbol。

  • Object.getPrototypeOf ( O )

    回傳物件O的原型物件。

  • Object.hasOwn ( O, P )

    檢驗物件O的屬性P是不是自己的還是繼承而來的,並用Boolean回傳結果,如果是自己的則回傳true,不是則回傳false

  • Object.is ( value1, value2 )

    檢驗value1跟value2是否相同,並用Boolean回傳結果

  • Object.isExtensible ( O )

    檢驗物件O是否可以添加新的屬性,並用Boolean回傳結果

  • Object.isFrozen ( O )

    檢驗物件O是被凍結,即是物件O有沒有運行過Object.isFrozen( O )

  • Object.isSealed ( O )

    檢驗物件O的屬性能不能被刪除,並用Boolean回傳結果

  • Object.keys ( O )

    感覺跟getOwnPropertyNames很類似,
    將物件O所有Properties的key化作陣列輸出

  • Object.preventExtensions ( O )

    禁止物件O添加新的屬性,
    當運用Object.preventExtensions ( O )之後
    用Object.isExtensible ( O )檢驗回=會回傳false

  • Object.prototype

    後續會說到的物件Object.prototype的初始對象,
    其內容為:
    [[Writable]]: false,
    [[Enumerable]]: false,
    [[Configurable]]: false

  • Object.seal ( O )

    使物件O的所有屬性不會被刪除,但是還是可以被修改。

  • Object.setPrototypeOf ( O, proto )

    改變物件O的原型對象,將proto最為物件O的新原型。
    但是極度不推薦使用。

  • Object.values ( O )

    將物件O的value化作陣列輸出。

Properties of the Object Prototype Object

  • Object.prototype.constructor
    物件的原型結構
  • Object.prototype.hasOwnProperty ( V )
    檢驗Object的屬性V是自身擁有的還是繼承來了,並回傳Boolean值表示,自身的屬性回傳true,是繼承來的回傳false。
  • Object.prototype.isPrototypeOf ( V )
    同樣是檢驗Object的屬性V是自身擁有的還是繼承來了,但是跟上面相反,繼承來的回傳true,自身的屬性回傳是false。
  • Object.prototype.propertyIsEnumerable ( V )
    檢驗Object的屬性V,在Property descriptor(屬性描述器)中的Boolean值。
  • Object.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )
    將物件的字串轉換成reserved1當地語言的字串。
  • Object.prototype.toString ( )
    用字串表示Object是什麼類型的,物件則是回傳
    "[object Object]"
    若是其他type呼叫時,僅是回傳相同的值
    如果要使用檢驗其他東西的type則要運用call
    Object.prototype.toString.call(檢驗對象)
    此時即可回傳檢驗對象的type
  • Object.prototype.valueOf ( )
    回傳指定對象的原始值,幾乎不會用到,JavaScript 在遇到需要調用原始值的狀況會自動調用。
  • Object.prototype.__proto__
    這是一個舊版的prototype,現今有更好的方式。
  • Legacy Object.prototype Accessor Methods
    這是一個舊版的prototype,現今有更好的方式。

Properties of Object Instances

物件除了繼承constructor的properties之外,沒有特別的property。

結語

物件少說一個Property Descriptor(屬性描述器)感覺就甚麼都不通順,總覺得卡卡的,後來才把這個補起來Property Descriptor(屬性描述器),雖然是急就章,但是可以多少多了解物件一點。

參考資料

EMCA262
MDN-Enumerability and ownership of properties
重新認識 JavaScript 深入理解 JavaScript 物件屬性
从深入到通俗:Object.prototype.toString.call()


上一篇
想轉職的鯊魚從零基礎開始學習JavaScript Day-17 The Global Object (全域物件)
下一篇
想轉職的鯊魚從零基礎開始學習JavaScript Day-19 Fundamental Objects(二)-Function Objects (函式物件)
系列文
想轉職的鯊魚從零基礎開始學習JavaScript31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言