JavaScript es6 class類的理解。
阿新 • • 發佈:2017-05-29
實例 leo super 提升 fin .info asc style function
在本篇文章我將會把我對JavaScript es6新特性class類的理解。本著互聯網的分享精神,我就將我自己的理解分享給大家。
使用es寫一個類(構造函數)
在es5中大家一般都這麽寫一個類(構造函數)
另外需要註意,class類不會被提升。
// 創建一個User構造函數 function User(name, age) { this.name = name; this.age = age; } // User構造函數的靜態方法。 User.getClassName = function () { return ‘User‘; }; // User構造函數的動態方法 User.prototype.changeName = function(age) { this.age = age }; Object.defineProperty(User.prototype, ‘info‘, { get (){ return ‘name: ‘ + this.name + ‘|‘ + ‘age: ‘ + this.age } }); // 創建一個Manager 構造函數 function Manager(name, age, password) { User.call(this, name, age); //將User函數call到Manager函數內 this.password = password }// 繼承User的靜態方法 Manager.__proto__ = User; // 調用繼承User的getClassName 方法。 console.log(Manager.getClassName()); // 繼承User動態方法 Manager.prototype = User.prototype; // 創建一個新的動態方法 changePassword Manager.prototype.changePassword = function (pwd) { this.password = pwd }; //實例化Manager 構造函數。 var manager = new Manager(‘zhang‘, 22, ‘123‘); manager.changeName(‘23‘); console.log(manager.info);
將es的構造函數轉換為類
以上方法確實沒有什麽問題,但是相對於es6的class來講沒有那麽優雅,下面我就用es6的語法讓代碼優雅一點。
其實本質上都是一樣的,只不過是一個語法糖。
/** * Created by 張佳偉 on 2017/5/2. */ ‘use strict‘; // function User(name, age) { // this.name = name; // this.age = age; // } class User { // 構造函數 現在叫類 本質是一樣的,其實就是一個語法糖。 constructor(name, age) { this.name = name; this.age = age; } // User.getClassName = function () { // return ‘User‘; // }; // 靜態方法 static getClassName() { return ‘User‘; } // User.prototype.changeName = function (name) { // this.name = name; // }; // 動態方法,相當於es中的prototype changeName(name) { this.name = name; } // User.prototype.changeAge = function (age) { // this.age = age; // }; changeAge(age) { this.age = age; } // Object.defineProperty(User.prototype, ‘info‘, { // get (){ // return ‘name: ‘ + this.name + ‘|‘ + ‘age: ‘ + this.age // } // }); get info() { return ‘name:‘ + this.name + ‘|age:‘ + this.age; } } ; // function Manager(name, age, password) { // User.call(this, name, age); // this.password = password; // } //繼承靜態方法 // Manager.__proto__ = User; // //繼承prototype原型方法 // Manager.prototype = User.prototype; // 繼承這裏省事吧,一步就到位了 class Manager extends User { constructor(name, age, password) { super(name, age); //這個我下面會將,這裏先暫時理解為call,但是註意他和call可不一樣。 this.password = password; } changePassword(password) { return this.password = password; } get info() { var info = super.info; //這個是父類的info,當然你也可以重寫info這個方法。那就是刪掉這句代碼,在寫上新的就行拉~ return info } } // console.log(typeof User, typeof Manager); var manager = new Manager(‘leo‘, 22, ‘123‘); // manager.changeName(‘zeng liang‘); console.log(manager.info); console.log(manager.changePassword(456))
立即執行類的寫法
‘use strict‘; // 立即執行的類 let User = new class User { constructor(name){ this.name = name; } }(‘鉛筆‘) console.log(User)
JavaScript es6 class類的理解。