摘要:另外只有調(diào)用之后,才可以使用關(guān)鍵字正確子類的屬性和的靜態(tài)方法,在一個方法前面,加上關(guān)鍵字,就表示該方法不會被實例繼承,但是可以被子類繼承但是可以被子類繼承,也可從上調(diào)用
初識Class
傳統(tǒng)的寫法
function Point(x, y) { this.x = x this.y = y } Point.prototype.toString = () => { return `( ${this.x}, ${this.y} )` }
ES6為了更接近面向?qū)ο蟮木幊谭绞剑峁┝薈lass的概念
class Point { constructor (x, y) { this.x = x this.y = y } toString { return `( ${this.x}, ${this.y} )` } }
上面定義了一個‘類’,一個構(gòu)造方法constructor,this是實例對象,一個toString方法(注意沒有function這個保留字)
class類中的方法(除constructor之外)其實都定義在類的prototype屬性上
// 比如toString(),相當(dāng)于 Point.prototype = { toString(){} } // 所以類的新方法可以這樣添加進去 Object.assign(Point.prototype, { toString(){}, toValue(){} }) Point.prototype.constructor === Point // true構(gòu)造方法和實例對象
通過new命令生成對象實例時都默認(rèn)自動調(diào)用constructor方法,一個類必須有constructor方法,沒有顯式定義的話,一個空的con方法會被默認(rèn)添加
constructor () {}
該方法默認(rèn)返回實例對象(就是this),但是可以指定返回另一個對象
class Foo { constructor { return Object.create(null) } } new Foo() instanceof Foo // false
實例對象的創(chuàng)建同之前一樣
class Point { // 這里為了縮小工作量,沒有全部書寫 constructor () {} tostring () {} } let point = new Point(2, 3) point.toString() // (2, 3) point.hasOwnProperty("x") // true,因為該實例屬性顯式的定義在this上 point.hasOwnProperty("toString") // false,因為方法都是定義在原型上的 point.prototype.hasOwnProperty("toString") // true point._proto_ === Point.prototype // true
ES6的Class只是ES5的構(gòu)造函數(shù)的一層包裝,所以繼承了函數(shù)的許多屬性,包括name屬性
class Point {} Point.name // "Point"
class不存在變量提升
new Foo() // ReferenceError class Foo {} // let Foo = class {} // class Bar extends Foo {} // 因為class沒有提升,所以上面代碼不會報錯class的繼承
class childPoint extends Point { constructor(x, y, color) { super(x, y) this.color = color } toString() { return this.color + "" + super.toString() // 等于Parent.toString() } }
子類必須在constructor方法中調(diào)用super方法,否則新建實例會出錯。另外只有調(diào)用super之后,才可以使用this關(guān)鍵字
class Point{} class childPoint extends Point{ constructor (x, y, color) { this.color = color // ReferenceError super(x, y) this.color = color // 正確 } } let cp = new childPoint() // ReferenceError
子類的_proto_屬性
class B extends A { } B._prototype_ === A // true B.prptotype._proto_ === A.prototype // true Object.getPrototypeof(B) === A // true
getter和setter
class MyClass { get prop() { return "getter" } set prop(value) { console.log("setter:" + value ) } } let inst = new MyClass() inst.prop = 123 // setter: 123 inst.prop // "getter"
Class的靜態(tài)方法,在一個方法前面,加上static關(guān)鍵字,就表示該方法不會被實例繼承,但是可以被子類繼承
class Foo { static classMethod () { return "hello" } } Foo.classMethod() // hello let foo = new Foo() foo.classMethod() // TypeError: undefined is not a function // 但是可以被子類繼承,也可從super上調(diào)用 class Bar extends Foo { // static classMethod() { // return super.classMethod() + ", too" // } } Bar.classMethod() // hello
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/84732.html
摘要:不同于其他面向?qū)ο笳Z言,以前的中中沒有類的概念,主要是通過原型的方式來實現(xiàn)繼承,中引入了原型鏈,并且將原型鏈用來實現(xiàn)繼承,其核心是利用原型使得一個對象繼承另一個對象的方法和屬性,中原型繼承的關(guān)鍵是將一個實例的原型對象指向另一個實例,因此前一 不同于其他面向?qū)ο笳Z言,ES6以前的JavaScript中中沒有class類的概念,主要是通過原型的方式來實現(xiàn)繼承,JavaScript中引入了原...
摘要:前言在理想的狀態(tài)下,你可以在深入了解之前了解和開發(fā)的所有知識。繼承另一個類的類,通常稱為類或類,而正在擴展的類稱為類或類。這種類型的組件稱為無狀態(tài)功能組件。在你有足夠的信心構(gòu)建用戶界面之后,最好學(xué)習(xí)。 原文地址:JavaScript Basics Before You Learn React 原文作者: Nathan Sebhastian 寫在前面 為了不浪費大家的寶貴時間,在開...
摘要:語言傳統(tǒng)方法通過構(gòu)造函數(shù)定義并生成新對象,引入了這個概念作為對象的模板,通過關(guān)鍵字可以定義類。基本語法等同于上面的代碼表明,類的數(shù)據(jù)類型就是函數(shù),類本身指向構(gòu)造函數(shù)。屬性引入了屬性,在構(gòu)造函數(shù)中返回命令所作用的構(gòu)造函數(shù)。 JS語言傳統(tǒng)方法通過構(gòu)造函數(shù)定義并生成新對象,ES6引入了Class這個概念作為對象的模板,通過class關(guān)鍵字可以定義類。 基本語法 function Point(...
摘要:靜態(tài)方法靜態(tài)方法直接用類名來調(diào)用就可以了,熟悉面向?qū)ο缶幊痰耐瑢W(xué)應(yīng)該都不陌生。在中,一個類不能繼承多個類。為了解決這個問題,可以使用。當(dāng)類表達式有命名時,該命名僅作為類內(nèi)部使用。 本文同步自我得博客:http://www.joeray61.com 簡介 ES6的Classes是在原型鏈繼承的基礎(chǔ)上,由語言本身提供的語法糖,并非是一種全新的繼承模式。這使得Javascript有一種更加簡...
閱讀 3387·2021-11-22 15:22
閱讀 2371·2021-09-06 15:00
閱讀 871·2020-06-22 14:39
閱讀 3704·2019-08-30 15:56
閱讀 1540·2019-08-30 12:55
閱讀 3260·2019-08-29 17:19
閱讀 3231·2019-08-26 11:41
閱讀 613·2019-08-23 17:14