繼承及模塊化

首先定義一個父類:

// 定義一個人名
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 ......

今天瞭解一下幾種繼承的方式及模塊化規範並記錄下來,如有錯誤請指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章