溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

一文帶你讀懂es5 類與es6中的class有什么不同

發布時間:2020-11-10 14:46:30 來源:億速云 閱讀:242 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關一文帶你讀懂es5 類與es6中的class有什么不同,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

前言

在es5中主要是通過構造函數方式和原型方式來定義一個類,在es6中我們可以通過class來定義類,今天整理一下它們的區別。

關于es5中定義類的方式,可以看這一篇Js的‘類',我們這里主要聊es5類和es6中class類的區別。

一、class類必須new調用,不能直接執行。

一文帶你讀懂es5 類與es6中的class有什么不同

class類執行的話會報錯,而es5中的類和普通函數并沒有本質區別,執行肯定是ok的。

二、class類不存在變量提升

一文帶你讀懂es5 類與es6中的class有什么不同

一文帶你讀懂es5 類與es6中的class有什么不同

圖2報錯,說明class方式沒有把類的定義提升到頂部。

三、class類無法遍歷它實例原型鏈上的屬性和方法

function Foo (color) {
 this.color = color
}
Foo.prototype.like = function () {
 console.log(`like${this.color}`)
}
let foo = new Foo()

for (let key in foo) {
 // 原型上的like也被打印出來了
 console.log(key) // color、like
}
class Foo {
 constructor (color) {
  this.color = color
 }
 like () {
  console.log(`like${this.color}`)
 }
}
let foo = new Foo('red')

for (let key in foo) {
 // 只打印一個color,沒有打印原型鏈上的like
 console.log(key) // color
}

四、new.target屬性

es6為new命令引入了一個new.target屬性,它會返回new命令作用于的那個構造函數。如果不是通過new調用或Reflect.construct()調用的,new.target會返回undefined

function Person(name) {
 if (new.target === Person) {
 this.name = name;
 } else {
 throw new Error('必須使用 new 命令生成實例');
 }
}

let obj = {}
Person.call(obj, 'red') // 此時使用非new的調用方式就會報錯

五、class類有static靜態方法

static靜態方法只能通過類調用,不會出現在實例上;另外如果靜態方法包含 this 關鍵字,這個 this 指的是類,而不是實例。static聲明的靜態屬性和方法都可以被子類繼承。

class Foo {
 static bar() {
 this.baz(); // 此處的this指向類
 }
 static baz() {
 console.log('hello'); // 不會出現在實例中
 }
 baz() {
 console.log('world');
 }
}

Foo.bar() // hello

關于一文帶你讀懂es5 類與es6中的class有什么不同就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女