首頁  >  文章  >  web前端  >  es6的class是做什麼的

es6的class是做什麼的

青灯夜游
青灯夜游原創
2022-10-26 18:49:432240瀏覽

es6的class關鍵字用來快速定義「類別」;class的本質就是function,它可以看作一個語法糖,讓物件原型的寫法更清晰、更像物件導向程式設計的語法。提升class不存在變數提升,類別的所有方法都定義在類別的prototype屬性上面,在類別的實例上面呼叫方法,其實就是呼叫原型上的方法。

es6的class是做什麼的

本教學操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。

基礎

  • es6引進了Class(類別)這個概念,class關鍵字用來快速定義「類別」。新的class寫法讓物件原型的寫法更清晰、更像物件導向程式設計的語法,也更簡單易懂。

  • 其實背後依然使用的 原型與建構函數的概念。

  • 嚴格模式 不需要使用use strict因為只要程式碼寫在類別和模組內,就只能使用嚴格模式。

  • 提升class不存在變數提升 (由於繼承有關 必須確保子類別在父類別之後定義)。

  • 類別的所有方法都定義在類別的prototype屬性上面,在類別的實例上面調用方法,其實就是呼叫原型上的方法原型方法可以透過實例物件調用,但不能透過類別名稱調用,會報錯誤

class 為es6用來定義一個類別
  • 實際上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屬性

name 屬性回傳了類別的名字即緊接在class後面的名字。

class Person {
}
Person.name // Person

this 預設指向類別的實例。

類別的方法內部如果含有this 坑兒一但單獨使用該方法很可能就會報錯
如果this指向不對1使用箭頭函數2在構造方法中綁定this

取值函數(getter)與儲存值函數(setter)

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

constructor關鍵字

  • #constructor 方法
  • constructor 方法是類別的預設方法,透過new 指令產生物件實例時,自動呼叫該方法(預設會傳回實例物件this)。
  • 一個類別必須有 constructor 方法,如果沒有明確定義,一個空的 constructor 方法會被預設為新增。
  • 一個類別只能擁有一個名為 “constructor” 的特殊方法,如果類別包含多個 constructor 的方法,則會拋出 一個 SyntaxError 。
class Person {
   constructor(x, y) {
    this.x = x    //默认返回实例对象 this
    this.y = y
  }
  toString() {
    console.log(this.x + ', ' + this.y)
  }
}

constructor 啥子?

#每一個類別必須由一個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關鍵字

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繼承

在繼承即子承父業現實中程式中子類別可以繼承父類別中的一些方法和屬性
繼承時物件導向的一大特性可以減少程式碼的編寫方便公共內容的抽取關鍵字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内部有定义

采用class表达式 可以写出立即执行的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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn