首頁 >web前端 >js教程 >ECMAScript6入門之Class物件的實例詳解

ECMAScript6入門之Class物件的實例詳解

零下一度
零下一度原創
2017-04-28 10:01:031753瀏覽

這篇文章主要介紹了詳解ECMAScript6入門--Class對象,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

物件導向的語言有一個標誌,那就是他們都有類別的概念,透過類別可以創造任意多個具有相同屬性和方法的物件。

ECMAScript5中沒有類別的概念,因此它的物件和基於類別的語言中的物件有所不同。

Javascript產生物件的傳統方法是透過建構函式來實現的

function Person(name, age){
  this.name = name;
  this.age = age;
  this.sayHello = function(){
    return "Hello "+ this.name;
  }
}

var person = new Person("dahan",18);
person.sayHello();
//Hello dahan

上述這種方式因為和Javascript中宣告方法的形式一樣,所以物件和方法的區分並不明顯,容易造成混淆。

ES6引進了Class(類別)的概念,我們透過ES6的語法進行建立物件的時候,可以像Java語法一樣,使用關鍵字class,用來定義類別。當然,這種語法的功能,透過ES5也都可以實現,它只是讓類別的定義更清晰,更容易理解。

//类的定义
class Person {
  //ES6中新型构造器
  constructor(name) {
    this.name = name;
  }
  //实例方法
  sayName() {
    console.log("我的名字叫"+ this.name);
  }
}
//类的继承
class Programmer extends Person {
  constructor(name) {
    //直接调用父类构造器进行初始化
    super(name);
  }
  program() {
    cosnole.log("这是我的地盘");
  }
}
//运行测试
var person = new Person('lingxiao');
var coder = new Programmer('coder');

person.sayName();
//我的名字叫lingxiao
coder.sayName();
//我的名字叫coder
coder.program();
//这是我的地盘

下面來注意講述一下上述程式碼中出現的語法。

constructor

constructor是類別的預設方法,就像Java中的main方法一樣,每個類別都必須有 constructor方法。

在透過new實例化物件的時候,就會自動呼叫constructor方法,得到的也就是constructor傳回的值。 constructor預設傳回目前類別的實例物件(this),但是我們也可以指定另外一個對象,當然,這樣就會導致實例化出來的對象,並不是目前類別的實例。

class Person {
  constructor(){
    var ob = new Object();
    return Ob;
  }
  sayHello(){
    return "Hello World"
  }
}
var person = new Person();
person.sayHello();
//Uncaught TypeError: person.sayHello is not a function

我們在實例化物件的時候,ES6規定我使用new關鍵字,如果直接調用,會當成函數來調用。

class Person {
  constructor(name){
    this.name = name;
  }
};
var person = Person("dahan");
//Uncaught TypeError: Class constructor Person4 cannot be invoked without 'new'

this

在最開始的程式碼中,我們看到了this,this在類別中指向的就是實例本身,但是如果我們在類別的方法中使用了this,單獨呼叫此方法的時候,就會出現錯誤。

class Person{
  constructor(name){
    this.name = name;
  }
  sayHello() {
    return "Hello "+this.name
  }
}
var person = new Person("dahan");
var sayHello = person.sayHello;
sayHello();
//Uncaught TypeError: Cannot read property 'name' of undefined

針對這個我們可以很簡單的在建構方法中綁定this

#
class Person{
  constructor(name){
    this.name = name;
    this.sayHello = this.sayHello.call(this);
  }
  sayHello() {
    return "Hello "+this.name
  }
}

#繼承extend

我們想要在一個類別上擴展一些屬性,但又不想修改原類,就用到了繼承。

//类的继承
class Programmer extends Person {
  constructor(name,age) {
    this.age = age;//报错
    //直接调用父类构造器进行初始化
    super(name);
  }
  program() {
    cosnole.log("这是我的地盘");
  }
}

使用繼承的時候,需要用super關鍵字來呼叫父類,super(name)就呆逼啊呼叫父類的constructor 方法。

另外,我們使用的繼承的時候,super關鍵字也幫我們改變了this的指向,所以我們必須先呼叫super方法,然後才能使用this。 ES6要求,子類別的建構函數必須執行一次super函數,否則就會報錯。

最後

class關鍵字的出現,也讓Javascript看起來更像一個物件導向語言,願Javascript越變越好越易用。

以上是ECMAScript6入門之Class物件的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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