es6
以前,一般使用構造函數來建立對象javascript
// 構造函數 User function User(username, email) { this.username = username; this.email = email; } // 爲了讓實例共享方法,將其添加到原型上 User.prototype.changeEmail = function(newEmail) { this.email = newEmail; } // 使用 let user = new User("zen", "ihuangmx@qq.com") user.changeEmail("change@qq.com"); console.log(user.email); //=> "change@qq.com"
而 es6
則能夠寫成html
class User { // 實例化時,調用 constructor 方法,默認返回 this constructor(username, email) { this.username = username; this.email = email; } // 類的全部方法會自動綁定到原型對象上,包括 constructor changeEmail(newEmail) { this.email = newEmail; } } // 使用 let user = new User("zen", "ihuangmx@qq.com") user.changeEmail("change@qq.com"); console.log(user.email); //=> "change@qq.com"
類中能夠定義靜態方法,也可使用 get
與 set
進行訪問控制:java
class User { constructor(username, email) { this.username = username; this.email = email; } changeEmail(newEmail) { this.email = newEmail; } static register(...args) { return new User(...args); } // 等價 // static register(username, email) { // return new User(username, email); // } get info() { return this.username + " " + this.email; } // 首字符大寫 set name(name) { this.username = name.slice(0,1).toUpperCase().concat(name.slice(1)); } } // 使用 let user = User.register("zen", "ihuangmx@qq.com") console.log(user.info) // zen ihuangmx@qq.com user.name = "jack" console.log(user.info) // Jack ihuangmx@qq.com
類能夠做爲參數進行傳遞:
function log(strategy) { strategy.handle(); } class ConsoleLogger { handle() { console.log("log log log"); } } log(new ConsoleLogger); //=> log log log
在 TaskCollection.js
中定義一個類webpack
class TaskCollection { constructor(tasks = []) { this.tasks = tasks; } dump() { console.log(this.tasks); } }
在 main.js
中使用該類es6
const tc = new TaskCollection([ 'shop', 'eat', 'sleep' ]); tc.dump();
index.html
- 顯示頁面。若是要使其生效的話,在不使用第三方庫的狀況下,只能將兩個文件同時引入web
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script src="TaskCollection.js"></script> <script src="main.js"></script> </body> </html>
這樣作的話,咱們將沒法看到彼此間的關聯(main.js
加載 TaskCollection.js
),所以,es6
提供瞭解決方案,即模塊。經過 export
和 import
來實現npm
TaskCollection.js
- 使用 export
命令顯式指定輸出的代碼json
// 輸出類 export class TaskCollection { constructor(tasks = []) { this.tasks = tasks; } dump() { console.log(this.tasks); } } // 輸出函數 export function foo(){ console.log("foo"); } // 輸出變量 export let bar = 123; // 能夠統一輸出,使其一目瞭然 // export {TaskCollection, foo, bar};
main.js
- 使用 import
加載模塊瀏覽器
import { TaskCollection, foo, bar as bar1 } from './TaskCollection'; const tc = new TaskCollection([ 'shop', 'eat', 'sleep' ]); tc.dump(); foo(); console.log(bar1);
index.html
- 只須要引用 main.js
函數
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script src="main.js"></script> </body> </html>
因爲當前的瀏覽器還不支持 es6 語法,咱們可使用打包工具。這裏簡單的舉兩個。
全局安裝
$ cnpm install --global rollup
使用
$ rollup main.js --format iife --output bundle.js # 針對客戶端指定格式爲 iife
而後只須要引用生成的 bundle.js
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script src="bundle.js"></script> </body> </html>
安裝
$ cnpm install -g webpack
打包
$ webpack main.js bundle.js
或者在當前項目下使用
$ cd webpack-demo-2
$ cnpm install webpack --save-dev
創建配置文件並設置
/webpack-demo-2/webpack.config.js var webpack = require('webpack'); module.exports = { entry: './main.js', output: { filename: './dist/main.js' } }
打包
$ webpack
一般是將其加入到 package.json
中
webpack-demo-2/package.json
{ "devDependencies": { "webpack": "^2.5.1" }, "scripts": { "build": "webpack" } }
如今,只須要運行
$ cnpm run build
能夠注意到,rollup
和 webpack
都僅僅是將其打包,並無轉化爲兼容的 js
。
// 部分打包後的代碼 // dist/main.js "use strict"; /* harmony export (immutable) */ __webpack_exports__["b"] = foo; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return bar; }); // export 命令顯式指定輸出的代碼 // 輸出類 class TaskCollection { constructor(tasks = []) { this.tasks = tasks; } dump() { console.log(this.tasks); } }
這裏以 webpack 爲例,講解如何轉化爲兼容的 js,首先安裝相關工具
$ cnpm install --save-dev buble-loader buble
添加
/webpack-demo-2/webpack.config.js
var webpack = require('webpack'); module.exports = { entry: './main.js', output: { filename: './dist/main.js' }, module: { loaders: [ { test: /.js$/, loaders: 'buble-loader' } ] } }
執行
$ cnpm run build
如今,能夠發現已經轉化爲兼容的 js 了