ES 6のクラス

7764 ワード

参照リンク:https://segmentfault.com/a/11...参照リンク:https://segmentfault.com/a/11...
何がクラスですか
オブジェクト指向プログラミングにおけるクラスは、状態(メンバー変数)と挙動実現(メンバー関数または方法)のためのオブジェクトを作成するための初期値を提供する拡張プログラムコードテンプレートです.
実際の開発において、私たちは多くの同じ種類のオブジェクトを作成する必要があります.newの一つのfunctionによってオブジェクトを作成することができることは知っていますが、現代のJavaScriptには、より高級な「クラス」構造があり、対象に向けてプログラミングするのにいい特性があります.
基本文法
class MyClass{
       constructor(){}
       method1(){}
       method2(){}
       method3(){}
     }
その後、new MyClassを通じて、上記の方法を有するオブジェクトのインスタンスを作成し、同時にnewオペレータ構造法によって自動的に呼び出される.これは構造方法においていくつかの初期化作業ができることを意味する.
class User{
      constructor(name){
        this.name = name
      }
      showInfo(){
        alert(this.name)
      }
    }
  var user = new User('WhiteCode') // new                            ,     this.name
  user.showInfo()
  //           
クラスは関数の一種です.
class User{ //      User                
      constructor(name){
        this.name = name
      }
      showInfo(){ // User.prototype          showInfo
      //                  ,               User            
        alert (this.name)
      }
    }
    alert(typeof User)//function
    alert(User === User.prototype.constructor) //true
    alert(User.prototype.showInfo)//showInfo(){  alert (this.name) }
      // there are exactly two methods in the prototype
    alert(Object.getOwnPropertyNames(User.prototype)) //constructor,showInfo
ES 5とES 6の比較
es5
function People(name,age){
      this.name = name
      this.age = age
    }
    People.prototype.say = function(){
      console.log("hello")
    }
    People.see = function(){
      alert("how are you")
    }
    var a = new People()
    a.say()
    
    
    .  es6 class   
    class People{
    constructor(name,age){
      this.name = name
      this.age = age
    }
    see(){ alert('how are you')}
    say(){
      console.log('hello')
    }
  }
    var a = new People()
    a.say()
①Peopleは一つの種類であり、一つの関数でもあります.②constructorは、オブジェクトが指すPeople関数であり、nameとageのプロパティが掛けられている.③say関数をPeopleの原型にマウントします.
多くのJavaScriptエンジンのクラス構造関数の文字列表示形式は「class...」で始まる.
         。          ,    enumerable     false。
          。                      。
従来の関数とは異なり、newがないと、クラス構造関数を呼び出すことができません.
class User{
    constructor(){}
  }
  alert(typeof User);//function
  User();// Error: Class constructor User cannot be invoked without 'new'
関数のように、クラスは別の表現で定義され、伝達、戻り、割り当てなどができます.
let User = class{  //          ,              
      showInfo(){
        alert('hello')
      }
    }
    new User().showInfo()
必要に応じて動的にクラスを作成できます.
function makeClass(rass){
    // declare a class and return it
    return class{
      showInfo(){
        alert(rass)
      }
    }
  }
  // Create a new class
  let User = makeClass('hello')
  new User().showInfo()//hello
Getters/Setters
//      getter/setter,   ,             get/set   user.name
  class User{
    constructor(name){
      this._name =name
    }
    get name(){
      return this._name
    }
    set name(value){
      if(value.length<4){
        alert('      ')
        return
      }
      this._name = name
    }
  }
  let user = new User('biubiu')
  alert(user.name)
  user = new User()//      '
Userのプロトタイプオブジェクトでは、クラス宣言によりget/setを作成します.
Object.defineProperties(User.prototype,{
    name:{
      get(){
        return this._name
      },
      set(name){
        // ...
      }
    }
  })
class User {
      name = "see"
      sayHi(){
        alert(`hello,${this.name}!`)
      }
    }
    new User().sayHi()
//       User           new              ,                        
クラスの内部でgetとsetキーワードが使えます.
ある属性に対して、値関数と値取り関数を設定し、この属性のアクセス挙動をブロックします.
class MyClass {
      constructor(){
        // ...
      }
      get prop(){
        return 'getter';
      }
      set prop(value){
        console.log('setter:'+ value)
      }
    }
     let inst = new MyClass()
     inst.prop = 124  //setter:124
     var a = inst.prop
     console.log(a) //getter
    //  prop               ,               
保存関数と取得関数は、プロパティdescriptorオブジェクトに設定されています.
class CustomHTMLElment {//               descriptor    
     constructor(element){
       this.element = element
     }
     get html(){
       return this.element.innerHTML
     }
     set html(value){
       this.element.innerHTML = value
     }
   }
  //  Object.getOwnPropertyDescriptor                          ,    underfined
   var descriptor = Object.getOwnPropertyDescriptor(CustomHTMLElment.prototype,'html')
   console.log(descriptor) //{enumerable: false, configurable: true, get: ƒ, set: ƒ}
  //               html         
  console.log('get' in descriptor)//true
  console.log('get' in descriptor)//true
Es 6におけるクラスの私有と保護された属性及び方法
JavaScriptには、2つのタイプのオブジェクトフィールド(属性と方法)があります.
公共の:どこにでもアクセスできます.外部インターフェースを含みます.私たちは開発においていつもよく使われているのは、公共の属性と方法です.
class MBWCar{
     oilAmount = 0
     constructor(power){
       this.power = power
       alert(`Created a mbw-car,power: ${power}`)
     }
   }
   let mbwCar = new MBWCar(100)
   mbwCar.oilAmount = 200
  //            oilAmount power         ,                   
  //  oilAmount     protected          
保護された属性は通常以下の線を引く.プレフィックスのためにこれは言語レベルで強制的に実行されるものではないが、我々プログラマの間には周知の慣例があり、外部からこれらの属性および方法にアクセスするべきではない.
class MBWCar{
    _oilAmount = 0
    constructor(power){
      this._power = power
    }
    set oilAmount(value){
      if (value<0) throw new Error('Negative oil')
      this._oilAmount = value
    }
    get oilAmount(){
        return  this._oilAmount
    }
  }
  let mbwCar = new MBWCar(100)
  mbwCar.oilAmount = -10 //Error Negative oil
  console.log(mbwCar)  //        ,              。
パワー属性は読み取り専用属性に設定できます.値は変更できません.
class MBWCar{
      constructor(power){
        this._power = power
      }
      get power(){
        return this._power
      }
    }
    let mbwCar = new MBWCar(100)
    alert(`Power is: ${mbwCar.power}W`)
    mbwCar.power = 25//Error (no set)
getter/setter方法
class Car{
      _oilMount = 0
      setOilMount(value){
        if(value<0)throw Error('Negative oil')
        this._oilMount = value
      }
      getOilMount(){
        return this._oilMount
      }
    }
    let car = new Car()
    car.setOilMount(100)
    alert(car.getOilMount())
//              
//        Car  Car                     this._oilMount  this._power                  
プライベートフィールド
これはjsによって追加されたクラス属性に対するシンタックスであり、jsエンジンは現在部分的にサポートされています.
class Car{
    #oilLimit = 100
    #checkOil(value){
      if(value>0) throw Error('Negative oil')
      if(value > this.#waterLimit) throw new Error('Too much oil')
    }
  }
  let car = new Car()
  car.#checkOil() //error
  car.#waterLimit = 1000 //Error

  class BWMCar extends Car{
    methods(){
      alert(this.#oilLimit) // Error: can only access from Car
    }
  }
プライベートフィールドはthis[name]を通じてアクセスできません.
class User{
    sayHi(){
      let filedName = 'Darkcod'
      alert(`Hello,${this.filedName}`)
    }
  }
  new User().sayHi()
1対象向けプログラミングの最も重要な原則の一つである外部インターフェースから内部インターフェースを区分することは、属性と方法に関するアクセス可能範囲2は対象向けプログラミングにおいて、prvate protected publicによって、クラスの属性と方法を制限することができます.例えば、あなたはお父さんからいくつかの属性を継承しました.しかし、あなたのお父さんはいくつかの属性を継承していますが、お父さんの他の属性はあなたに継承されたくないです.javascriptで保護された属性と方法は何ですか?最初の私有の属性と方法名は、萼頭4を対象にプログラミングした大きな利点の一つです.内部実装を理解する必要はなく、依然としてよくプログラミング開発ができます.