es6的class關鍵字用來快速定義「類別」;class的本質就是function,它可以看作一個語法糖,讓物件原型的寫法更清晰、更像物件導向程式設計的語法。提升class不存在變數提升,類別的所有方法都定義在類別的prototype屬性上面,在類別的實例上面呼叫方法,其實就是呼叫原型上的方法。
本教學操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。
es6引進了Class(類別)這個概念,class關鍵字用來快速定義「類別」。新的class寫法讓物件原型的寫法更清晰、更像物件導向程式設計的語法,也更簡單易懂。
其實背後依然使用的 原型與建構函數的概念。
嚴格模式 不需要使用use strict因為只要程式碼寫在類別和模組內,就只能使用嚴格模式。
提升class不存在變數提升 (由於繼承有關 必須確保子類別在父類別之後定義)。
類別的所有方法都定義在類別的prototype屬性上面,在類別的實例上面調用方法,其實就是呼叫原型上的方法原型方法可以透過實例物件調用,但不能透過類別名稱調用,會報錯誤
實際上class只是一個語法糖是建構函數的另一種寫法
(語法糖是一種為避免編碼出錯和提高效率編碼而生的語法層面的優雅解決方案簡單說一種便攜寫法而已)
看程式碼
class Person{ } console.log(typeof Person) //funciton console.log(Person.prototype.constructor === Person) //true
使用看程式碼
用法和使用建構子一樣 透過new 來產生物件實例
class person2 { } let json = new person2;
定義在constructor 內的屬性與方法即呼叫在this上屬於實例屬性與方法 否則屬於原型屬性與方法
class Person { constructor (name) { this.name = name //constructor内定义的方法和属性是实例对象自己的, } say () { //而constructor外定义的方法和属性则是所有实例对象可以共享的 注意! console.log('hello') } } let jon = new Person() jon.hasOwnPrototype('name') //true jon.hasOwnPrototype('say') //false
不需要透過實例對象,可以直接透過類別來呼叫的方法,其中的this 指向類別本身
class Person { static doSay () { this.say() } static say () { console.log('hello') } } Person.doSay() //hello *********************************************************************************************** //静态方法可以被子类继承 class Sub extends Person { } Sub.doSay() // hello //静态方法可以通过类名调用,不能通过实例对象调用,否则会报错 class Person { static sum(a, b) { console.log(a + b) } } var p = new Person() Person.sum(1, 2) // 3 p.sum(1,2) // TypeError p.sum is not a function
name 屬性回傳了類別的名字即緊接在class後面的名字。
class Person { } Person.name // Person
類別的方法內部如果含有this 坑兒一但單獨使用該方法很可能就會報錯
如果this指向不對1使用箭頭函數2在構造方法中綁定this
class Person { get name () { return 'getter' } set name(val) { console.log('setter' + val) } } let jon = new Person() jon.name = 'jon' // setter jon jon.name // getter
class Person {}
class Person {}
// TypeError Identifier 'Person' has already been declared
class Person { constructor(x, y) { this.x = x //默认返回实例对象 this this.y = y } toString() { console.log(this.x + ', ' + this.y) } }
#每一個類別必須由一個constructor 如果沒有顯示宣告js引擎會自動加入一個空的建構子
class person3 { } //等于 class person3 { constructor(){} }
注意 在類別中宣告方法的時候,方法前不加 function 關鍵字 方法之間不要用逗號分隔,否則會報錯 類別的內部所有定義的方法,都是不可枚舉的(non-enumerable)
注意與es5一樣實例的屬性除非顯示定義在其本身(即this物件)上否則都是定義在原型上面
class Point { constructor(x,y){ this.x = x; this.y = y; } toString(){ return `this.x + this.y`; } } var point = new Point(); point.toString() //(2,3) point.hasOwnProperty("x") //true point.hasOwnProperty("y") //true 在这x&&y都是实例对象point自身的属性(因为定义在this变量上) // 所以返回true point.hasOwnProperty("toString") //false toString是原型对象的属性 (因为定义在Point类上) //所以返回false point._proto_.hasOwnProperty("toString") //true //加两个实例 var p1 = new Point(); var p2 = new Point(); p1._proto_ === p2._proto_ //true 这个不建议使用 //上面代码中 p1和p2 都是point的实例 他们的原型都是Point.prototype 所以 _proto_属性是相等的 //即是说 可以通过实例的_proto_ 属性为 "类" 添加方法
super關鍵字用於存取和呼叫父類別上的函數,可以呼叫父類別的建構子也可以調用父類別的普通函數
class Father { constructor (surname){ this.surname = surname } say(){ console.log("你的名字" + this.surname) //你的名字锤子 } } //在这里 子继承父类 class Son extends Father { constructor(surname,name){ super(surname) this.name = name } say(){ super.say() console.log('调用普通' + this.name) //调用普通铁的 } } var son = new Son('锤子',"铁的") son.say() console.log(son) //打印 {surname: "锤子", name: "铁的" //在子类的构造函数如果使用 super 调用父类的构造函数 必须写在 this之前 //还可以 调用父类的普通方法 //在es6中 类没变量提升 必须先定义 才能通过实例化对象类里面的 共有属性 和方法 通过this 调用 //类 里面的this 代表什么 //constructor 里面this指向实例对象 // 方法里面this 代表 方法的 调用者
在繼承即子承父業現實中程式中子類別可以繼承父類別中的一些方法和屬性
繼承時物件導向的一大特性可以減少程式碼的編寫方便公共內容的抽取關鍵字extends
class Father { constructor (surname){ this.surname = surname } say(){ //父级Father里面有一个方法 say() console.log("你的名字" + this.surname) } } class Son extends Father { //在这里Son 继承了 Father父级里面的方法 关键字extends } var son = new Son('锤子') //new 出来实例 son.say() //打印 你的名字锤子
class Person { constructor(name, age) { // 构造函数,接收一个name和age this.name = name this.age = age } say(){ // 一个方法 //注意类里面的方法不加function关键字 方法与方法之间不用,号隔开 console.log("你好",this.name) } // ....sayWhat(){} saySome(){} } var person = new Person('老王',44) //调用方法 person.say() //老王 //在类的实例上调用方法 其实就是调用 原型上的方法
与函数一样 calss 也可以使用表达式的形式定义 采用class表达式 可以写出立即执行的Class!!
注意与函数表达式类似 类表达式在他们被求值前也不能使用(即赋值变量 之前调用) 但 与函数定义不同 虽然函数声明可以提升 但类不能
类表达式(类定义)
类表达式可以是被命名的或匿名的
let Person = class { constructor(x, y) { this.x = x this.y = y } }
let Person = class Person { constructor(x, y) { this.x = x this.y = y } } const Mycalss = class Me { getClassName(){ return Me.name; } }; //这里用 表达式(即赋值变量一个) //注意! 这个类的名字是Mycalss而不是 Me Me只在Class的内部代码可用 指代当前类 let inst = new Mycalss(); inst.getClassName() //Me Me.name //报错 Me只在Class内部有定义
let person = new class { constructor(name) { this.name = this.name; } sayname(){ console.log(this.name); } }("常东东") //这段代码中class是立即执行的实例
class Animal { //class定义了一个“类” constructor(){ this.type = 'animal' //有一个constructor方法,这就是构造方法 //this关键字则代表实例对象 } //constructor内定义的方法和属性是实例对象自己的,而constructor外定义的方法和属性则是所有实例对象可以共享的 注意! says(say){ console.log(this.type + ' says ' + say) } } let animal = new Animal() animal.says('hello') //animal says hello class Cat extends Animal { //通过extends关键字实现继承 //定义了一个Cat类,该类通过extends关键字,继承了Animal类的所有属性和方法。 constructor(){ super() //super关键字 它指代父类的实例(即父类的this对象)子类必须在constructor方法中调用super方法,否则新建实例时会报错。 this.type = 'cat' //这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工。如果不调用super方法,子类就得不到this对象。 } } let cat = new Cat() cat.says('hello') //cat says hello
【相关推荐:javascript视频教程、编程视频】
以上是es6的class是做什麼的的詳細內容。更多資訊請關注PHP中文網其他相關文章!