继承及模块化

首先定义一个父类:

// 定义一个人名
function Person (name) {
  // 属性
  this.name = name || 'Person';
  // 实例方法
  this.sleep = function(){
    console.log(this.name + '正在睡觉!');
  }
}
// 原型方法
Person.prototype.eat = function(food) {
  console.log(this.name + '正在吃:' + food);
};

原型链继承
我们把父类的实例作为子类的原型

function Anybody(){}
Anybody.prototype = new Person(); //将父类的实例作为子类的原型
Anybody.prototype.name = '张三'; 

var anybody = new Anybody();
console.log(anybody.name); //张三
console.log(anybody.eat('fish')); //张三正在吃fish
console.log(anybody.sleep()); //张三正在睡觉!

构造函数继承
使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(没用到原型)

function Li(name){
  Person.call(this);
  this.name = name || '李四';
}

var li = new Li();
console.log(li.name); //李四
console.log(li.sleep());//李四正在睡觉!
模块化加载规范
  • CommonJS规范
  • AMD(异步加载模块)
  • CMD规范(异步加载模块)
  • ES6模块化

CommonJS规范
允许模块通过require方法来同步加载要依赖的其他模块,然后通过exports或module.exports来导出需要暴露的接口。

// 导入
require("../app.js");
// 导出
exports.getStoreInfo = function() {};
module.exports = someValue;

它的好处是简单容易使用,服务器端模块便于复用,不好的地方呢是同步加载方式不适合在浏览器环境中使用,同步代表阻塞加载,浏览器资源是异步加载的,而且不能非阻塞的并行加载多个模块

AMD(异步加载模块)
使用异步方式加载模块,模块的加载不影响后面语句的运行。所有依赖模块的语句,都定义在一个回调函数中,等到加载完成之后,回调函数才执行。

// 定义
define("module", ["dep1", "dep2"], function(d1, d2) {...});
// 加载模块
require(["module", "../app"], function(module, app) {...});
//加载模块require([module], callback);第一个参数[module],是一个数组,里面的成员就是要加载的模块;第二个参数callback是加载成功之后的回调函数。

它适合在浏览器环境中异步加载模块并且可以并行加载多个模块,不好的点是提高了开发成本,代码的阅读和书写比较困难,模块定义方式的语义不顺畅。
大概执行过程:

  1. require函数检查依赖的模块,根据配置文件,获取js文件的实际路径
  2. 根据js文件实际路径,在dom中插入script节点,并绑定onload事件来获取该模块加载完成的通知。
  3. 依赖script全部加载完成后,调用回调函数

CMD规范(异步加载模块)
CMD规范和AMD很相似,和CommonJS和Node.js的 Modules 规范保持了很大的兼容性;在CMD规范中,一个模块就是一个文件。

  • 定义模块使用全局函数define,其接收 factory 参数,factory 可以是一个函数,也可以是一个对象或字符串;
  • factory 是一个函数,有三个参数,function(require, exports, module):
//require 是一个方法,接受模块标识作为唯一参数,用来获取其他模块提供的接口:require(id)
//exports 是一个对象,用来向外提供模块接口
//module 是一个对象,上面存储了与当前模块相关联的一些属性和方法
define(function(require, exports, module) {
  var a = require('./a');
  a.doSomething();
  // 依赖就近书写,什么时候用到什么时候引入
  var b = require('./b');
  b.doSomething();
});

优点是依赖就近,延迟执行并且可以很容易在 Node.js 中运行

ES6模块化
ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。

// 导入
import "/app";
import React from "react";
import { Component } from "react";
// 导出
export { } 
export default 
export function multiply() {...};
export var year = 2018;
export default ......

今天了解一下几种继承的方式及模块化规范并记录下来,如有错误请指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值