ES6 學習筆記之四 對象的擴展

来源:https://www.cnblogs.com/matchless/archive/2018/08/08/9355943.html
-Advertisement-
Play Games

ES6 為對象字面量添加了幾個實用的功能,雖然這幾個新功能基本上都是語法糖,但確實方便。 一、屬性的簡潔表示法 當定義一個對象時,允許直接寫入一個變數,作為對象的屬性,變數名就是屬性名。 例1: 與例2: 是相同的。 二、方法的簡潔表示法 下麵的例子是方法的簡潔表示法(例3) 和下例是完全等同的(例 ...


ES6 為對象字面量添加了幾個實用的功能,雖然這幾個新功能基本上都是語法糖,但確實方便。

一、屬性的簡潔表示法

當定義一個對象時,允許直接寫入一個變數,作為對象的屬性,變數名就是屬性名。

例1:

var x = 2, y = 3,
o = {
    x,
    y
}

與例2:

var x = 2, y = 3,
o = {
    x: x,
    y: y
}

是相同的。

二、方法的簡潔表示法

下麵的例子是方法的簡潔表示法(例3)

let o = {
    m (x) {
        console.log(x);
    }
}
o.m("Hello!");

和下例是完全等同的(例4)

let o = {
    m: function (x) {
        console.log(x);
    }
}
o.m("Hello!");

由於例3和例4完全相同,也就是說例3中的函數也是匿名函數,不能在函數內部使用函數名調用自身,因此下例(例5)這種使用命名函數定義方法,並作自我調用的情況,是不能使用方法的簡潔表示法的:

let o = {
    factorial: function factorial (x) {\
        if (x > 1) {
            return x * factorial(x - 1)
        } else {
            return 1;
        }
    }
}
console.log(o.factorial(5));

三、 屬性名錶達式

ES6 允許在字面量定義對象時,使用表達式做屬性名和方法名,示例如下(例6):

 1 let firstName = 'first';
 2 let secondFrontName = 'se';
 3 let secondBehandName = 'cond';
 4 let funcName = function () {
 5     return 'func';
 6 }
 7 let methodName1 = 'sayHello';
 8 let methodName2 = 'sayBye';
 9 let obj = {
10     [firstName]: 'hello',
11     [secondFrontName + secondBehandName]: 'world',
12     [funcName()]: 'bye',
13     [methodName1]() {
14     console.log('Hello, world!');
15     },
16     [methodName2]: function () {
17     console.log('Goodbye!');
18   }
19 }
20 console.log(obj[firstName]);
21 console.log(obj[secondFrontName + secondBehandName]);
22 console.log(obj[funcName()]);
23 obj.sayHello();
24 obj.sayBye();

註意,在第13行時,同時使用了屬性名錶達式和方法的簡潔表示法,這是沒問題的。

但是不能同時使用屬性名錶達式和屬性的簡潔表示法,會報錯(例7):

let foo = 'bar';
let bar = 'abc';
let baz = { [foo] };

四、操作[Prototype]

作為原型繼承語言,在JavaScript中,prototype屬性是非常重要的。在前ES6中,瀏覽器提供了擴展的屬性__proto__,來獲取和設置它。

ES6 將這個屬性放在了標準的附錄部分,並且說明僅要求瀏覽器實現這個屬性,也就是說只有在瀏覽器中的腳本使用這個屬性才是安全可信賴的。

為保持對特定環境的非依賴,不應該在代碼中使用這個屬性。而應該使用 Object.setPrototypeOf(...) 和 Object.getPrototypeOf(...) 方法設置和獲取,這兩個方法是全環境安全的。

例8:

1 let proto = {};
2 proto.y = 20;
3 let obj = {x : 10};
4 console.log(Object.getPrototypeOf(obj));
5 console.log(obj.y);
6 Object.setPrototypeOf(obj, proto);
7 console.log(Object.getPrototypeOf(obj));
8 console.log(obj.y);

第四行的結果顯示,obj 的 [prototype] 是 Object,並且第五行獲得的 y 屬性為 undefined。

經過第6行的設置,obj 的 [prototype] 就是proto對象了,並且第8行 obj 的 y 屬性是循著原型鏈獲取到的 proto 對象的 y 屬性的值。

五、super

super 可以用來調用原型鏈上的方法,如下例(例9):

let proto = {
    foo () {
        console.log("I'm proto foo.");
    }
}
let parent = {

}
let obj = {
    foo () {
        super.foo();
        console.log("I'm obj foo.");
    }
}
Object.setPrototypeOf(parent, proto)
Object.setPrototypeOf(obj, parent);
obj.foo(); // I'm proto foo.
// I'm obj foo.

super 只能出現在方法的簡潔表示法定義中,如下例(例10)這樣是會報錯的:

let proto = {
    foo () {
        console.log("I'm proto foo.");
    }
}
let parent = {

}
let obj = {
    foo: function () {
        super.foo();
        console.log("I'm obj foo.");
    }
}
Object.setPrototypeOf(parent, proto)
Object.setPrototypeOf(obj, parent);
obj.foo();

對於要調用的方法是不是用簡潔表示法定義的,則沒有限制,如下例(例11):

let proto = {
    foo: function () {
        console.log("I'm proto foo.");
    }
}
let parent = {

}
let obj = {
    foo () {
        super.foo();
        console.log("I'm obj foo.");
    }
}
Object.setPrototypeOf(parent, proto)
Object.setPrototypeOf(obj, parent);
obj.foo();

六、 Object.is()方法和Object.assign()方法

Object.is() 方法用來比較兩個對象是否嚴格相等,它的行為與 === 極為相似,不同點有二:

1. +0 和 -0

對於 === 運算符,+0 和 -0 是相等的,而 Object.is()則認為這兩個值不同。

+0 === -0; // true
Object.is(+0, -0); // false

2. NaN 和 NaN

對於 === 運算符,NaN 和 NaN 是不等的,Object.is() 則認為這是相同的。

NaN == NaN; // false
Object.is(NaN, NaN); // true

 

Object.assign() 方法用來將一個至多個對象的可枚舉屬性拷貝到目標對象中。

Object.assign()方法的第一個參數是目標對象,後續的參數為源對象(參數必須是對象)。如果對象中有相同名稱的屬性,則排列在後的對象的屬性會覆蓋排在前面的對象的同名屬性。(這個方法,有點像 JQuery 中的 extend 方法)

例12:

let obj1 = {};
let obj2 = {
    prop: "I'm property",
    func () {
        return "I'm function.";
    }
}
Object.assign(obj1, obj2);
console.log(obj1);
console.log(obj1.func());

這一方法的限制是:它只複製自身的可枚舉屬性,繼承來的屬性不複製,不可枚舉屬性也不複製;另外它的複製是淺拷貝,即只處理一級屬性的添加和替換,嵌套屬性不處理。

如下例(例13)

let target = { a: { b: 'c', d: 'e' } };
let source = { a: { b: 'hello' } };
Object.assign(target, source); // { a: { b: 'hello' } }

註意此例的結果,target 的 a 屬性被 source 的 a 屬性完全替換,而不是 source 中 a 屬性的 b 嵌套屬性替換了 target 中 a 屬性的 b 嵌套屬性。如果你期望的結果是  { a: { b: 'hello', d: 'e' } } ,你可要失望了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先要說明 [].slice.call() 與 Array.prototype.slice.call() 有什麼區別? []為創建數組,當[].slice的時候,自然會去找原型鏈 1. Array.prototype.slice是定義的方法,可以被重寫 [].silce是使用定義的方法 2. 自身的 ...
  • 簡介 Location 對象存儲在 Window 對象的 Location 屬性中,表示那個視窗中當前顯示的文檔的 Web 地址。通過Location對象,可以獲取URL中的各項信息,調用對象方法也可以重新載入或替換當前文檔。 在控制台輸入 可以獲取Location對象的詳細信息: 對象屬性 hre ...
  • 1、面向對象與面向過程 既然說到面向對象的思維,那就免不了要對面向過程的編程思維與面向對象的思維做一番比較。 筆者有 一段時間天真的認為有一個類,然後new一個對象就是面向對象編程了,現在想想還是太naive了呀。 其實面向對象的編程思維和麵向過程的編程思維重要的不是對象和過程,而是思維。 比如說在 ...
  • "" ) 為什麼想寫這篇文章 工作這些年我所做的事情總是迴圈著,剛工作的時候html、js、jQuery用的也很溜,可是後面的七年都沒寫過前端代碼。現在由於項目原因,時不時的需要去寫點前端代碼,可是前端的世界已經在nodejs的幫助下發生了翻天覆地的變化,一個又一個的框架層出不窮。這篇文章記錄下我這 ...
  • 1、選中要刪除的學生信息 2、點擊 刪除選中 按鈕,把覆選框中的值取出提交到後臺 3、後臺獲取選中的id 4、前端也跟著刪除數據 示例代碼: 前端代碼: 後臺代碼:(只附上刪除的Servlet代碼) ...
  • 最近在項目開發中,有的地方用到了下拉覆選框,於是再網上找了一下,有很多種寫法,但自己感覺不是很好,又不想用插件,因為感覺引入的js太大,功能太繁雜,於是決定自己寫一個小demo,效果如下: (改善:當遇到選項比較多時,可以定義一個數組插入到HTML中,實現下拉的選項,可以參考省市區聯動的寫法:htt ...
  • 這節課講解 打包多頁面應用過程中的 提取公共代碼 部分。相比於 ,`4.0 optimization.splitChunks 3.0 CommonsChunkPlugin`插件。在使用和配置上,更加方便和清晰。 " 本節課源碼" " 所有課程源碼" 1. 準備工作 按照慣例,我們在 文件夾下創建 和 ...
  • 最近在類似於滴滴軟體的一款小程式,工程確實有點大,很多東西都是第一次做。這次記錄一下關於左滑刪除的一個代碼記錄。主要的思想就是計算滑動距離的大小來使用css中的 transition 控制滑動的效果,主流的都是控制邊距margin來達到左滑的效果。 根據我所拿到的ui,我所運用的是使用寬度和radi ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...