摘要:如果要使其生效的話,在不使用第三方庫的情況下,只能將兩個文件同時引入這樣做的話,我們將無法看到彼此間的關聯加載因此,提供了解決方案,即模塊。這里簡單的舉兩個。
類與模塊 類
es6 之前,通常使用構造函數來創建對象
// 構造函數 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 則可以寫成
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 進行訪問控制:
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 中定義一個類
class TaskCollection { constructor(tasks = []) { this.tasks = tasks; } dump() { console.log(this.tasks); } }
在 main.js 中使用該類
const tc = new TaskCollection([ "shop", "eat", "sleep" ]); tc.dump();
index.html - 顯示頁面。如果要使其生效的話,在不使用第三方庫的情況下,只能將兩個文件同時引入
Document
這樣做的話,我們將無法看到彼此間的關聯(main.js 加載 TaskCollection.js),因此,es6 提供了解決方案,即模塊。通過 export 和 import 來實現
TaskCollection.js - 使用 export 命令顯式指定輸出的代碼
// 輸出類 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
Document
由于當前的瀏覽器還不支持 es6 語法,我們可以使用打包工具。這里簡單的舉兩個。
rollup.js全局安裝
$ cnpm install --global rollup
使用
$ rollup main.js --format iife --output bundle.js # 針對客戶端指定格式為 iife
然后只需要引用生成的 bundle.js
index.html
webpackDocument
安裝
$ 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轉換 js
可以注意到,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 了
"use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return TaskCollection; }); /* harmony export (immutable) */ __webpack_exports__["b"] = foo; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return bar; }); // export 命令顯式指定輸出的代碼 // 輸出類 var TaskCollection = function TaskCollection(tasks) { if ( tasks === void 0 ) tasks = []; this.tasks = tasks; }; TaskCollection.prototype.dump = function dump () { console.log(this.tasks); };
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83306.html
摘要:特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 本以為自己收藏的站點多,可以很快搞定,沒想到一入匯總深似海。還有很多不足&遺漏的地方,歡迎補充。有錯誤的地方,還請斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應和斧正,會及時更新,平時業務工作時也會不定期更...
摘要:前言月份開始出沒社區,現在差不多月了,按照工作的說法,就是差不多過了三個月的試用期,準備轉正了一般來說,差不多到了轉正的時候,會進行總結或者分享會議那么今天我就把看過的一些學習資源主要是博客,博文推薦分享給大家。 1.前言 6月份開始出沒社區,現在差不多9月了,按照工作的說法,就是差不多過了三個月的試用期,準備轉正了!一般來說,差不多到了轉正的時候,會進行總結或者分享會議!那么今天我就...
閱讀 1297·2021-11-04 16:09
閱讀 3484·2021-10-19 11:45
閱讀 2396·2021-10-11 10:59
閱讀 1010·2021-09-23 11:21
閱讀 2762·2021-09-22 10:54
閱讀 1129·2019-08-30 15:53
閱讀 2600·2019-08-30 15:53
閱讀 3477·2019-08-30 12:57