面向對象的語言有一個標志,那就是他們都有類的概念,通過類可以創建任意多個具有相同屬性和方法的對象。
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();//我的名字叫lingxiaocoder.sayName();//我的名字叫codercoder.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,單獨調用此方法的時候,就會出現錯誤。
新聞熱點
疑難解答
圖片精選