ES6 Class(類) 總結(九)

ES6 中的 class 是一種面向對象編程的語法糖,提供了一種簡潔的方式來定義對象的結構和行為。

JavaScript 語言中,生成實例對象的傳統方法是通過構造函數。下面是一個例子。

function Point(x, y) {this.x = x;this.y = y;
}
Point.prototype.toString = function () {return '(' + this.x + ', ' + this.y + ')';
};
var p = new Point(1, 2);

基本上,ES6 的 class 可以看作只是一個語法糖,它的絕大部分功能,ES5 都可以做到,新的 class 寫法只是讓對象原型的寫法更加清晰、更像面向對象編程的語法而已。上面的代碼用 ES6 的 class 改寫,就是下面這樣:

class Point {constructor(x, y) {this.x = x;this.y = y;}toString() {return '(' + this.x + ', ' + this.y + ')';}
}

ES6 的類,完全可以看作構造函數的另一種寫法:

class Point {// ...
}
typeof Point // "function"
Point === Point.prototype.constructor // true----------------------------------------------------------------------------
class Point {constructor() {// ...}toString() {// ...}toValue() {// ...}
}
// 等同于
Point.prototype = {constructor() {},toString() {},toValue() {},
};

主要特性:

1. 聲明式語法:使用 class 關鍵字聲明類。
2. 構造函數:使用 constructor 方法初始化類實例。
3. 實例方法:定義在類內部的普通方法,使用 this 訪問實例屬性。
4. 靜態方法:使用 static 關鍵字定義,不依賴于類的實例。
5. 實例屬性:在構造函數中初始化,或使用字段聲明語法(目前是 Stage 3 proposal)。
6. 繼承:使用 extends 關鍵字實現。
7. super 關鍵字:在子類的構造函數中調用父類的構造函數或方法。
8. getter 和 setter:使用 get 和 set定義屬性的訪問器。
9. 私有屬性和方法:使用 # 定義私有屬性和方法(目前是 Stage 3 proposal)。

1. 基本類定義和實例化

class Point {constructor(x, y) {this.x = x;this.y = y;}toString() {return `Point(${this.x}, ${this.y})`;}
}let point = new Point(10, 20);
console.log(point.toString()); // 輸出: Point(10, 20)

2. 靜態方法、屬性

class MathUtils {constructor() {console.log(MyClass.myStaticProp); // 42}static add(a, b) {return a + b;}static myStaticProp = 42;
}console.log(MathUtils.add(1, 2)); // 輸出: 3

3. 繼承和 super

class Rectangle {constructor(width, height) {this.width = width;this.height = height;}area() {return this.width * this.height;}
}class Square extends Rectangle {constructor(sideLength) {super(sideLength, sideLength);}
}let square = new Square(5);
console.log(square.area()); // 輸出: 25

4. getter 和 setter

class Rectangle {constructor(width, height) {this.width = width;this.height = height;}get area() {return this.width * this.height;}set width(newWidth) {if (newWidth > 0) {this.width = newWidth;} else {console.log("Width must be positive.");}}
}let rect = new Rectangle(4, 5);
console.log(rect.area); // 輸出: 20
rect.width = -10; // 輸出: Width must be positive.

class的注意點

(1)嚴格模式

類和模塊的內部,默認就是嚴格模式,所以不需要使用 use strict 指定運行模式。只要你的代碼寫在類或模塊之中,就只有嚴格模式可用。考慮到未來所有的代碼,其實都是運行在模塊之中,所以 ES6 實際上把整個語言升級到了嚴格模式。

(2)不存在提升

類不存在變量提升(hoist),這一點與 ES5 完全不同。

new Foo(); // ReferenceError
class Foo {}//不會報錯
//因為 Bar 繼承 Foo 的時候, Foo 已經有定義了。
//但是,如果存在 class 的提升,上面代碼就會報錯,
//因為 class 會被提升到代碼頭部,而 let 命令是不提升的,
//所以導致 Bar 繼承 Foo 的時候, Foo 還沒有定義。
{let Foo = class {};class Bar extends Foo {}
}

(3)name 屬性

由于本質上,ES6 的類只是 ES5 的構造函數的一層包裝,所以函數的許多特性都被Class繼承,包括 name 屬性。

class Point {}
Point.name // "Point"
//name 屬性總是返回緊跟在 class 關鍵字后面的類名。

(4)Generator 方法

如果某個方法之前加上星號( * ),就表示該方法是一個 Generator 函數。

class Foo {constructor(...args) {this.args = args;}* [Symbol.iterator]() {for (let arg of this.args) {yield arg;}}
}
for (let x of new Foo('hello', 'world')) {console.log(x);
}
// hello
// world//Foo 類的 Symbol.iterator 方法前有一個星號,表示該方法是一個 Generator 函數。 
//Symbol.iterator 方法返回一個 Foo 類的默認遍歷器, for...of 循環會自動調用這個遍歷器。

(5)this 的指向

類的方法內部如果含有 this ,它默認指向類的實例。但是,必須非常小心,一旦單獨使用該方法,很可能報錯。

class Logger {printName(name = 'there') {this.print(`Hello ${name}`);}print(text) {console.log(text);}
}
const logger = new Logger();
const { printName } = logger;
printName(); // TypeError: Cannot read property 'print' of undefined

避免使用this,在構造方法中綁定 this:

class Logger {constructor() {this.printName = this.printName.bind(this);}// ...
}

避免使用this,使用箭頭函數:

class Obj {constructor() {this.getThis = () => this;}
}
const myObj = new Obj();
myObj.getThis() === myObj // true

避免使用this,使用 Proxy

function selfish (target) {const cache = new WeakMap();const handler = {get (target, key) {const value = Reflect.get(target, key);if (typeof value !== 'function') {return value;}if (!cache.has(value)) {cache.set(value, value.bind(target));}return cache.get(value);}};const proxy = new Proxy(target, handler);return proxy;
}
const logger = selfish(new Logger());

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44190.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44190.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44190.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用定時器消除抖動

問題:定時器中斷和按鍵中斷屬于什么操作模式,輪詢嗎? 具體怎么實現 定時器中斷 (判斷) 時間參數 按鍵中斷(修改) 中斷 向量表.s文件 DCD SysTick_Handler …

如何理解跨界營銷?詳解跨界營銷的主要類型和方法!

跨界營銷是一種創新的營銷策略,它巧妙地捕捉不同行業、產品和消費者偏好之間的共通點和潛在聯系。這種策略將看似不相關的元素相互融合,相互影響,創造出一種全新的生活方式和審美觀念,以此吸引目標消費者群體的注意和青睞。 通過…

Oracle左連接過濾條件注意事項

1、left join 結果集行數與主表查詢結果集行數一致 2、主表與輔表多關聯條件要括起來 3、對于輔表的過濾條件寫在on后面是先對輔表過濾后再與主表關聯,寫在where后面是對主表與輔表關聯后的結果集再進行過濾 4、對于主表的過濾條件寫在on后面不生效,只能…

LiveNVR監控流媒體Onvif/RTSP用戶手冊-用戶管理:編輯、添加用戶、關聯通道、重置密碼、刪除、過濾搜索

LiveNVR監控流媒體Onvif/RTSP用戶手冊-用戶管理:編輯、添加用戶、關聯通道、重置密碼、刪除、過濾搜索 1、用戶管理1.1、添加用戶1.2、關聯通道1.3、重置密碼1.4、編輯1.5、刪除1.6、過濾搜索 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒體服務 1、用戶管理 1.1、添加用戶 點擊用戶管理…

學習網絡的第一步:全面解析OSI與TCP/IP模型

我是小米,一個喜歡分享技術的29歲程序員。如果你喜歡我的文章,歡迎關注我的微信公眾號“軟件求生”,獲取更多技術干貨! Hello,大家好!我是你們的好朋友小米。今天我們來聊一聊網絡基礎知識中的重量級選手——OSI模型和TCP/IP模型!網絡的世界就像一個巨大的迷宮,而這兩個…

Docker 鏡像構建報 exec xxx.sh: no such file or directory

問題記錄 場景: 處于對nacos docker 部署最新版本的探究,但是nacos/nacos-server鏡像拉取不到最新版本,官網也是給出自己構建鏡像的方案。 具體步驟很簡單,先clone項目,然后簽出你要的nacos版本,通過docke…

算法力扣刷題記錄 四十二【101. 對稱二叉樹、100.相同的樹、572.另一個樹的子樹】

前言 二叉樹篇,開始對二叉樹操作練習。 記錄 四十二【101. 對稱二叉樹】。 繼續。 一、題目閱讀 給你一個二叉樹的根節點 root , 檢查它是否軸對稱。 示例 1: 輸入:root [1,2,2,3,4,4,3] 輸出:true示例 2&#x…

S5730交換機上配置訪問控制列表(ACL)、OSPF路由和PIM-SM組播

配置訪問控制列表(ACL) 假設我們創建一個簡單的ACL,允許或拒絕特定流量通過。 進入系統視圖 sys 創建一個標準ACL,允許192.168.1.0/24網段的流量通過 acl number 2001 rule 5 permit source 192.168.1.0 0.0.0.255 其他流量默…

Pytest單元測試系列[v1.0.0][Pytest基礎]

Pytest安裝與配置 和Unittest一樣,Pytest是另一個Python語言的單元測試框架,與Unittest相比它的測試用例更加容易編寫、運行方式更加靈活、報錯信息更加清晰、斷言寫法更簡潔并且它可以運行有unittest和nose編寫的測試用例。 Pytest 安裝 啟動命令行&…

【Pytorch】Conda環境下載慢換源/刪源/恢復默認源

文章目錄 背景臨時換源永久換源打開conda配置condarc換源執行配置 命令行修改源添加源查看源 刪源恢復默認源使用示范 背景 隨著實驗增多,需要分割創建環境的情況時有出現,在此情況下使用conda create --name xx python3.10 pytorch torchvision pytorc…

uni-app三部曲之二: 封裝http請求

1.引言 前面一篇文章寫了使用Pinia進行全局狀態管理。 這篇文章主要介紹一下封裝http請求,發送數據請求到服務端進行數據的獲取。 感謝: 1.yudao-mall-uniapp: 芋道商城,基于 Vue Uniapp 實現,支持分銷、拼團、砍價、秒殺、優…

電腦自動重啟是什么原因呢?99%人都不知道的解決辦法,直接打破循環

當你的電腦突然毫無預警地自動重啟,不僅打斷了工作流程,還可能導致未保存的數據丟失,這無疑是一件令人沮喪的事情。那么,電腦自動重啟是什么原因呢?有什么方法可以解決呢?別擔心,在大多數情況下…

Android Retrofit post請求,@Body傳遞的參數轉義問題

文章目錄 問題解決原因解決方案一:自己拼接json字符串,Body使用RequestBody類型,比如解決方案二:修改Retrofit的Gson 問題 因為傳遞的參數字符串中有等號 ,結果傳遞的時候,打印出來 原始字符串&#xff…

【AIGC】GPT-4深度解析:自然語言處理的新紀元

目錄 第一部分:GPT-4技術概覽 1.1 GPT-4模型架構 多模態輸入處理 專家混合(MoE)技術詳解 參數規模和模型復雜性 1.2 GPT-4的關鍵技術創新 上下文窗口的擴展 模型性能預測技術 1.3 GPT-4與其他模型的比較 性能對比 架構差異 第二部…

docker-2

27.構建python應用鏡像-dockerfile實踐項目 1.基于官方的鏡像,構建python代碼運行環境 dockerfile 2.運行鏡像,開啟一個讀寫的容器空間(定制操作,將代碼丟進去,運行調試) 3.提交這個變化的容器層數據&#…

cal命令

1、命令詳解: cal(全稱:Calendar)該命令用來顯示當前日歷或者指定日期的公歷。 2、官方參數: -1, --one 僅顯示當前月份(默認)-3, --three 顯示上個月、當前月和下個月-s, --sunday…

谷粒商城P85發布商品時規格參數不顯示問題

P85講,發布商品,點擊下一步之后,發現規格參數不顯示 打開控制臺發現報錯forEach...錯誤 查了問題原因,發現返回的分組中個別組的關聯屬性(attrs)可能為null 所以這個時候,需要確保后端返回的attrs不能為null 方式1…

數據結構之順序存儲線性表實現詳解與示例(C,C#,C++)

文章目錄 一、順序存儲線性表的基本概念二、順序存儲線性表的實現1、數據結構定義2、初始化3、添加元素4、訪問元素5、修改元素6、刪除元素7、銷毀 三、示例C語言示例C#語言示例C語言示例 順序存儲線性表是一種基本的數據結構,它將線性表的元素按照一定的順序存放在…

Mysql中存儲過程、存儲函數、自定義函數、變量、流程控制語句、光標/游標、定義條件和處理程序的使用示例

場景 存儲過程 存儲過程是一組為了完成特定功能的SQL語句集合。使用存儲過程的目的是將常用或復雜的工作預先用SQL語句寫好并用一個指定名稱存儲起來, 這個過程經編譯和優化后存儲在數據庫服務器中,因此稱為存儲過程。 當以后需要數據庫提供與己定義…

分享WPF的UI開源庫

文章目錄 前言一、HandyControl二、AduSkin三、Adonis UI四、Panuon.WPF.UI五、LayUI-WPF六、MahApps.Metro七、MaterialDesignInXamlToolkit八、FluentWPF九、DMSkin總結 前言 分享WPF的UI開源庫。 一、HandyControl HandyControl是一套WPF控件庫,它幾乎重寫了所…