资讯专栏INFORMATION COLUMN

Vue 2.0 入门系列(15)学习 Vue.js 需要掌握的 es6 (2)

vslam / 1584人阅读

摘要:如果要使其生效的话,在不使用第三方库的情况下,只能将两个文件同时引入这样做的话,我们将无法看到彼此间的关联加载因此,提供了解决方案,即模块。这里简单的举两个。

类与模块

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"

类中可以定义静态方法,也可以使用 getset 进行访问控制:

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 提供了解决方案,即模块。通过 exportimport 来实现

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




    
    Document



    

webpack

安装

$ 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

可以注意到,rollupwebpack 都仅仅是将其打包,并没有转化为兼容的 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);
};

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83306.html

相关文章

  • 前端资源系列(4)-前端学习资源分享&前端面试资源汇总

    摘要:特意对前端学习资源做一个汇总,方便自己学习查阅参考,和好友们共同进步。 特意对前端学习资源做一个汇总,方便自己学习查阅参考,和好友们共同进步。 本以为自己收藏的站点多,可以很快搞定,没想到一入汇总深似海。还有很多不足&遗漏的地方,欢迎补充。有错误的地方,还请斧正... 托管: welcome to git,欢迎交流,感谢star 有好友反应和斧正,会及时更新,平时业务工作时也会不定期更...

    princekin 评论0 收藏0
  • 前端相关大杂烩

    摘要:希望帮助更多的前端爱好者学习。前端开发者指南作者科迪林黎,由前端大师倾情赞助。翻译最佳实践译者张捷沪江前端开发工程师当你问起有关与时,老司机们首先就会告诉你其实是个没有网络请求功能的库。 前端基础面试题(JS部分) 前端基础面试题(JS部分) 学习 React.js 比你想象的要简单 原文地址:Learning React.js is easier than you think 原文作...

    fuyi501 评论0 收藏0
  • 个人分享--web前端学习资源分享

    摘要:前言月份开始出没社区,现在差不多月了,按照工作的说法,就是差不多过了三个月的试用期,准备转正了一般来说,差不多到了转正的时候,会进行总结或者分享会议那么今天我就把看过的一些学习资源主要是博客,博文推荐分享给大家。 1.前言 6月份开始出没社区,现在差不多9月了,按照工作的说法,就是差不多过了三个月的试用期,准备转正了!一般来说,差不多到了转正的时候,会进行总结或者分享会议!那么今天我就...

    sherlock221 评论0 收藏0
  • 前端文档收集

    摘要:系列种优化页面加载速度的方法随笔分类中个最重要的技术点常用整理网页性能管理详解离线缓存简介系列编写高性能有趣的原生数组函数数据访问性能优化方案实现的大排序算法一怪对象常用方法函数收集数组的操作面向对象和原型继承中关键词的优雅解释浅谈系列 H5系列 10种优化页面加载速度的方法 随笔分类 - HTML5 HTML5中40个最重要的技术点 常用meta整理 网页性能管理详解 HTML5 ...

    jsbintask 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<