1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        10 個在 JavaScript 中處理對象的實用函數(shù)

        共 6254字,需瀏覽 13分鐘

         ·

        2021-11-27 10:43

        英文 | https://medium.com/dailyjs/10-utility-functions-for-working-with-objects-in-javascript-a5ee53ef8809
        翻譯 | 楊小愛


        本文將著眼于在 JavaScript 中處理對象的最重要的實用函數(shù)。

        01、Object.freeze

        Object.freeze() 凍結(jié)一個對象。無法再更改凍結(jié)的對象。它返回傳入的相同對象。

        這是通過在創(chuàng)建時凍結(jié)對象來實現(xiàn) JavaScript 不變性的最簡單方法。

        const game = Object.freeze({ name: 'Warcraft'});game.developer = 'Blizzard';//TypeError: Cannot add property developer, object is not extensible
        唯一需要注意的是 Object.freeze() 只凍結(jié)對象的直接屬性,執(zhí)行所謂的“淺凍結(jié)”。稍后我們將使用遞歸和其他對象效用函數(shù)來實現(xiàn)深度凍結(jié)函數(shù)。
        02、Object.isFrozen
        Object.isFrozen() 檢測對象是否被凍結(jié)。
        console.log(Object.isFrozen(game));//true
        03、Object.keys
        Object.keys() 給出一個包含所有擁有的屬性鍵的數(shù)組。檢查下面的代碼,將游戲?qū)ο蟮乃墟I檢索到一個新的字符串數(shù)組中。
        const game = {  name: 'Warcraft',  developer: 'Blizzard'};const keys = Object.keys(game);console.log(keys);// ["name", "developer"]
        一旦我們有了鍵數(shù)組,我們就可以開始在它上面使用數(shù)組方法了,比如 forEach。
        Object  .keys(game)  .forEach(key => console.log(key));
        04、Object.values()
        Object.values() 返回一個包含所有擁有的屬性值的數(shù)組。
        const values = Object.values(game);console.log(values);// ["Warcraft", "Blizzard"]
        05、Object.entries
        Object.entries() 返回一個對象所有屬性的 [key, value] 對數(shù)組。
        const game = {  name: 'Warcraft',  developer: 'Blizzard'};const keyValuePairs = Object.entries(game);console.log(keyValuePairs);// [//  ["name", "Warcraft"],//  ["developer", "Blizzard"]// ]
        請注意,條目是一個具有兩個值 [key, value] 的數(shù)組。結(jié)果是一組數(shù)組。
        一旦我們在數(shù)組中擁有所有 [key, value] 對,我們使用數(shù)組方法。
        Object  .entries(game)  .forEach(([key, value]) => console.log(key, value));//name Warcraft//developer Blizzard
        創(chuàng)建一個深度凍結(jié)工具
        現(xiàn)在讓我們嘗試使用 Object.entries 和 Object.freeze 實用程序創(chuàng)建一個深度凍結(jié)實用程序。
        請記住 Object.freeze 會進行淺度凍結(jié)。考慮下面的游戲?qū)ο?,developer 屬性在其中存儲了一個對象,而不是一個字符串。
        即使我們凍結(jié)游戲?qū)ο?,我們也可以更改開發(fā)者對象的名稱。
        const game = {  name: 'Overwatch',  developer: {    name: 'Blizzard'  }};Object.freeze(game);game.developer.name = 'Activision Blizzard';console.log(game);//{ // developer: {name: "Activision Blizzard"}, //  name: "Overwatch"//}
        以下是我們?nèi)绾问褂眠f歸實現(xiàn) deepFreeze 函數(shù)。首先,我們將所有條目作為 [key, value] 對的數(shù)組獲取。
        然后我們使用 forEach 數(shù)組方法遍歷所有這些屬性,并對作為對象的值再次調(diào)用 deepFreeze。
        最后,我們凍結(jié)并返回當前對象。
        function deepFreeze(object) {  Object   .entries(object)   .forEach(([name, value]) => {     if (value && typeof value === 'object') {       deepFreeze(value);     }   });   return Object.freeze(object);}
        現(xiàn)在,如果我們嘗試更改內(nèi)部對象的屬性,則會出現(xiàn)錯誤。
        deepFreeze(game);game.developer.name = 'Activision Blizzard';//Cannot assign to read only property 'name' of object
        將對象轉(zhuǎn)換為地圖
        我們可以使用 Object.entries 和 Map 構(gòu)造函數(shù)將對象轉(zhuǎn)換為地圖。這是一個例子。
        const game = {  name: 'Warcraft',  developer: 'Blizzard'};const map = new Map(Object.entries(game));console.log(map);//Map(2) {"name" => "Warcraft", "developer" => "Blizzard"}
        06、Object.fromEntries
        我們執(zhí)行相反的操作并使用 Object.fromEntries 實用程序?qū)?[key, value] 對數(shù)組轉(zhuǎn)換為對象。
        考慮下面的代碼。
        const keyValuePairs = [  ["name", "Warcraft"],  ["developer", "Blizzard"]];const game = Object.fromEntries(keyValuePairs);console.log(game);//{name: "Warcraft", developer: "Blizzard"}
        07、Object.create() 
        Object.create() 使用另一個對象作為新對象的原型創(chuàng)建一個新對象。
        這是一個具有 toString 方法的原型對象。
        const gamePrototype = {  toString : function(){    return `${this.name}, developed by ${this.developer}`;  }};
        然后我們使用之前的原型來創(chuàng)建一個引用它的新對象。
        const game = Object.create(gamePrototype);game.name = "Overwatch";game.developer = "Blizzard";console.log(game.toString());//'Overwatch, developed by Blizzard'
        08、Object.getPrototypeOf
        Object.getPrototypeOf() 返回指定對象的原型。
        Object.getPrototypeOf(game) === gamePrototype;//true
        即使是空的對象字面量也有一個原型,即 Object.prototype。
        const obj = {};Object.getPrototypeOf(obj) === Object.prototype;//true
        09、Object.assign() 
        Object.assign() 將擁有的屬性從一個或多個源對象復制到目標對象。然后它返回目標對象。
        下面是我們將 gameMethods 對象中的屬性復制到游戲?qū)ο笾械氖纠?/span>
        const gameMethods = {  toString : function(){    return `${this.name}, developed by ${this.developer}`;  }};const game = {  name: 'Diablo',  developer: 'Blizzard'};Object.assign(game, gameMethods);console.log(game.toString());//'Diablo, developed by Blizzard'

        我們可以避免修改現(xiàn)有的游戲?qū)ο?,而是?chuàng)建一個包含來自現(xiàn)有游戲和 gameMethods 對象的屬性的新對象。

        我們可以通過將它們的屬性復制到一個空對象來做到這一點。

        const anotherGame = Object.assign({}, game, gameMethods);console.log(anotherGame.toString());//'Diablo, developed by Blizzard'

        如您所見,我們能夠使用 Object.assign 和 Object.create 將 toString 方法添加到游戲?qū)ο笾小?/span>

        不同之處在于 Object.assign 將屬性添加到每個新創(chuàng)建的對象中。Object.create 僅向新創(chuàng)建的對象添加對現(xiàn)有原型的引用。

        它不會復制所有可重用的屬性。只有在構(gòu)建數(shù)千個對象時才能注意到這種差異。

        Object.assign() 也可用于克隆普通對象。

        const game = { name: 'Starcraft'};const anotherGame = Object.assign({}, game);console.log(anotherGame);//{name: "Starcraft"}console.log(game === anotherGame);//false

        10、Object.defineProperty

        Object.defineProperty 實用程序修改現(xiàn)有屬性或在對象上定義新屬性。它改變并返回修改后的對象。

        Object.defineProperty 主要用于設置特定的屬性描述符,如可枚舉性或定義只讀屬性。

        考慮以下對象。

        const game = {  name: 'Fornite',  developer: 'Epic Games',  toString: function(){    return `${this.name}, developed by ${this.developer}`;  }};Object.keys(game);//["name", "developer", "toString"]

        默認情況下,所有新屬性都是可枚舉的。如您所見,調(diào)用 Object.key 實用程序時還返回了 toString 屬性名稱。

        如果我們不希望 toString 成為可枚舉屬性,我們可以使用 Object.defineProperty 實用程序?qū)⑵錁擞洖榭擅杜e屬性。

        Object.defineProperty(game, 'toString', {    enumerable: false});console.log(Object.keys(game));//["name", "developer"]

        盡管如此,我們可以根據(jù)需要更改 toString 屬性。

        game.toString = undefined;

        我們通過將 toString 屬性上的可寫描述符設置為 false 來避免這種行為。

        Object.defineProperty(game, 'toString', {    enumerable: false,    writable: false});game.toString = undefined;//Cannot assign to read only property 'toString' of object

        Object.defineProperty 實用程序可用于添加動態(tài) getter 和 setter。

        下面是向游戲?qū)ο筇砑觿討B(tài) getter 的示例。僅當用戶有權(quán)訪問時,getter 才返回屬性的值,否則會引發(fā)錯誤。

        const game = {  name: 'Fornite',  developer: 'Epic Games',};const hasRight = false;const propName = "name";Object.defineProperty(game, propName, {  get : function () {    if(hasRight){      return game[propName];    } else {      throw `${propName} no access`;    }  }});console.log(game.name);//name no access

        重點說明

        • 我們擁有用于凍結(jié)和檢測凍結(jié)對象的實用程序。(Object.freeze / Object.isFrozen)

        • 其他實用程序幫助我們在新數(shù)組中提取對象的所有屬性,從而使我們能夠訪問強大的數(shù)組方法。(Object.keys / Object.values / Object.entries)

        • 我們可以創(chuàng)建一個繼承自現(xiàn)有原型的新對象,然后使用另一個實用程序函數(shù)來檢查給定對象的原型。(Object.create/Object.getPrototypeOf)

        • 使用 Object.entries 和 Object.fromEntries 助手將對象轉(zhuǎn)換為 [key, value] 對數(shù)組,然后再轉(zhuǎn)換回對象變得簡單。這使得在地圖和對象之間轉(zhuǎn)換變得容易。

        • Object.assign() 幫助我們克隆對象或?qū)⒍鄠€對象的屬性復制到一個新對象中。

        • Object.defineProperty 實用程序修改現(xiàn)有屬性或定義新屬性。它主要用于更改屬性描述符。

        總結(jié)

        以上這些內(nèi)容就是 JavaScript 中處理對象的一些最重要的實用函數(shù)。如果您覺得它對您有所幫助,請記得給我點贊,同時,也請您分享給您身邊做開發(fā)的朋友。



        學習更多技能

        請點擊下方公眾號

        瀏覽 26
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            日女人的逼 | 97超碰免费 | b想要叉叉网站在线看 | 精品亲子伦一区二区三区小说国产 | 草逼无码| 亚洲老妇交性506070 | 亚洲电影免费在线观看 | 成人欧美一区二区三区黑人免费 | 免费高清无码 | 又大又长又粗又硬又爽视频 |