這篇文章主要介紹了詳解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中文網其他相關文章!