国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ES6—class與模塊化(9)

weij / 2571人閱讀

摘要:中的模塊功能主要由兩個命令構成和。命令用于規定模塊的對外接口,命令用于輸入其他模塊提供的功能,二者屬于相輔相成一一對應關系。文件大括號里面的變量名,必須與被導入模塊對外接口的名稱相同。每一個模塊內聲明的變量都是局部變量,不會污染全局作用域。

JavaScript語言自創立之初,一直沒有模塊(module)體系,無法將一個大程序拆分成互相依賴的小文件,再用簡單的方法拼裝起來。

很多編程語言都有這項功能,比如 Python的import、Ruby的require,甚至就連CSS都有@import,但是JavaScript沒有這方面的支持,這增加了開發大型的、復雜的項目時的難度。

于是前端開發者們開始想辦法,為了防止命名空間被污染,采用的是命名空間的方式。

在ES6之前,一些前端社區制定了模塊加載方案,最主要的有CommonJS和AMD兩種。前者用于服務器,后者用于瀏覽器。

但這兩種規范都由開源社區制定,沒有統一,而ES6中引入了模塊(Module)體系,從語言層在實現了模塊機制,實現了模塊功能,而且實現得相當簡單,為JavaScript開發大型的、復雜的項目掃清了障礙。

ES6中的模塊功能主要由兩個命令構成:export和import。

export命令用于規定模塊的對外接口,import命令用于輸入其他模塊提供的功能,二者屬于相輔相成、一一對應關系。

一、什么是模塊

模塊可以理解為函數代碼塊的功能,是封裝對象的屬性和方法的javascript代碼,它可以是某單個文件、變量或者函數。

模塊實質上是對業務邏輯分離實現低耦合高內聚,也便于代碼管理而不是所有功能代碼堆疊在一起,模塊真正的魔力所在是僅導出和導入你需要的綁定,而不是將所有的東西都放到一個文件。

在理想狀態下我們只需要完成自己部分的核心業務邏輯代碼,其他方面的依賴可以通過直接加載被人已經寫好模塊進行使用即可。

二、export 導出 命令

一個模塊就是一個獨立的文件,該文件內部的所有變量,外部無法獲取。如果想從外部能夠讀取模塊內部的某個變量,就必須使用export關鍵字輸出該變量。分為以下幾種情況:

(1)在需要導出的lib.js文件中, 使用 export{接口} 導出接口, 大括號中的接口名字為上面定義的變量, import和引入的main.js文件中的export是對應的:

//lib.js 文件
let bar = "stringBar";
let foo = "stringFoo";
let fn0 = function() {
    console.log("fn0");
};
let fn1 = function() {
    console.log("fn1");
};
export{ bar , foo, fn0, fn1}

//main.js文件
import {bar,foo, fn0, fn1} from "./lib";
console.log(bar+"_"+foo);
fn0();
fn1();

(2)在export接口的時候, 我們可以使用 XX as YY, 把導出的接口名字改了, 比如: xiaoming as haoren,

這樣做的目的是為了讓接口字段更加語義化。

//lib.js文件
let fn0 = function() {
    console.log("fn0");
};
let obj0 = {}
export { fn0 as foo, obj0 as bar};

//main.js文件
import {foo, bar} from "./lib";
foo();
console.log(bar);

(3)直接在export的地方定義導出的函數,或者變量:

//lib.js文件
export let foo = ()=> {console.log("fnFoo") ;return "foo"},bar = "stringBar";

//main.js文件
import {foo, bar} from "./lib";
console.log(foo());
console.log(bar);

(4)不需要知道變量名字(相當于是匿名的)的情況,可以 直接把開發的接口給export。如果一個js模塊文件就只有一個功能, 那么就可以使用export default導出。

//lib.js
export default "string";

//main.js
import defaultString from "./lib";
console.log(defaultString);

這樣做的好處是其他模塊加載該模塊時,import命令可以為該匿名函數指定任意名字。

(5)export也能默認導出函數, 在import的時候, 名字可以自定義, 因為每一個模塊的默認接口就一個:

//lib.js
let fn = () => "string";
export {fn as default};

//main.js
import defaultFn from "./lib";
console.log(defaultFn());


(6)使用通配符* ,重新導出其他模塊的接口

//lib.js
export * from "./other";
//如果只想導出部分接口, 只要把接口名字列出來
//export {foo,fnFoo} from "./other";

//other.js
export let foo = "stringFoo", fnFoo = function() {console.log("fnFoo")};

//main.js
import {foo, fnFoo} from "./lib";
console.log(foo);
console.log(fnFoo());

三、import 導入命令

ES6導入的模塊都是屬于引用,每一個導入的js模塊都是活的, 每一次訪問該模塊的變量或者函數都是最新的, 這個是原生ES6模塊 與AMD和CMD的區別之一。

使用export命令定義了模塊的對外接口以后,其他 JS 文件就可以通過import命令加載這個模塊。

//main.js文件
import {bar,foo, fn0, fn1} from "./lib";
console.log(bar+"_"+foo);
fn0();
fn1();

大括號里面的變量名,必須與被導入模塊對外接口的名稱相同。

想要輸入的變量重新取一個名字,import命令要使用 as關鍵字,將輸入的變量重命名。

import { formatFn as fn0 } from "lib.js";

注:import后面的from指定模塊文件的位置,可以是相對路徑,也可以是絕對路徑,.js后綴可以省略。

四、ES6模塊化的基本規則、特點

1、每一個模塊只加載一次, 每一個JS只執行一次, 如果下次再去加載同目錄下同文件,直接從內存中讀取。 一個模塊就是一個單例,或者說就是一個對象。

2、每一個模塊內聲明的變量都是局部變量, 不會污染全局作用域。

3、模塊內部的變量或者函數可以通過export導出。

4、一個模塊可以導入別的模塊。

五、class與模塊化相結合實例

結合上節課我們學的 ES6 class與面向對象編程的知識,我們再實現一個把class和模塊化結合的例子。

首先我們創建一個parent.js文件,使用class類的寫法創建一個Parent類:

const name = "tom";
const age = "20";

class Parent{
  hw(){
    console.log(`hello world`)
  }
  static obj(){
      console.log("obj")/*表示為靜態方法不回唄實例繼承,而是直接通過類調用。*/
    }
}  
var parent = new Parent()
parent.hw()//hell world

export{name,age,Parent}

之后在child.js中分別引入parent.js中的name、age、Parent

import {name,age,Parent} from "./parent"


class Child extends Parent{
    constructor(obj){
        //就是new命令自動跳用方法。一個類必須要有constructor,如果沒定義,有默認添加一個空的。
        super()//調用父類的constructor()
        this._config = obj;
        console.log(obj.name+"年齡"+obj.age)
    }
    hw(){
      console.log("hw")
    }
    set val(value){
      this._config.name = value;
      console.log(`name=${value}`)
    }
    get val(){
      console.log(this._config.name);
    }
}

Child.obj()//obj 繼承父類static方法
var model = new Child({name,age}) //tom年齡20
model.hw()//hw
model.val = "jock"; //name=jock
model.val//jock

六、總結

本文主要從什么是模塊,模塊的導出(導出變量、函數、類、文件等),模塊的導入(單個導入、多個導入、導入整個)等角度講述了ES6模塊化操作。

ES6模塊的設計思想,是盡量的靜態化,使得編譯時就能確定模塊的依賴關系,以及輸入和輸出的變量。CommonJS和AMD模塊,都只能在運行時確定這些東西。比如 CommonJS模塊就是對象,輸入時必須查找對象屬性。

模塊打包現在最好用的就是webpack了,webpack作為一款新興的模塊化管理和打包工具,其視任意文件都為模塊,并打包成bundle文件,相比于browserify更加強大。

模塊化開發是前端開發的一大趨勢,比如大家去看vue、react、angular,或者你們公司的項目源碼,你會發現,幾乎所有項目都使用了模塊化。小伙伴們一定要緊跟時代的大潮,將組件化開發,模塊化開發,自動化構建結合,探索高效的開發之道。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/109450.html

相關文章

  • ES6

    摘要:對象可被不定參數和默認參數完美代替。將對象納入規范,提供了原生的對象。規定,命令和命令聲明的全局變量,屬于全局對象的屬性命令命令命令聲明的全局變量,不屬于全局對象的屬性。。這些函數表達式最適合用于非方法函數,并且它們不能用作構造函數。 ES6的了解 新增模板字符串(為JavaScript提供了簡單的字符串插值功能)、箭頭函數(操作符左邊為輸入的參數,而右邊則是進行的操作以及返回的值In...

    snifes 評論0 收藏0
  • 10個最佳ES6特性

    摘要:,正式名稱是,但是這個名稱更加簡潔。已經不再是最新的標準,但是它已經廣泛用于編程實踐中。而制定了模塊功能。自從年雙十一正式上線,累計處理了億錯誤事件,得到了金山軟件等眾多知名用戶的認可。 譯者按: 人生苦短,我用ES6。 原文: Top 10 ES6 Features Every Busy JavaScript Developer Must Know 譯者: Fundebug 為了保...

    codeKK 評論0 收藏0
  • ES6、ES7、ES8、ES9、ES10新特性一覽

    摘要:規范最終由敲定。提案由至少一名成員倡導的正式提案文件,該文件包括事例。箭頭函數這是中最令人激動的特性之一。數組拷貝等同于展開語法和行為一致執行的都是淺拷貝只遍歷一層。不使用對象中必須包含屬性和值,顯得非常冗余。 ES全稱ECMAScript,ECMAScript是ECMA制定的標準化腳本語言。目前JavaScript使用的ECMAScript版本為ECMA-417。關于ECMA的最新資訊可以...

    Muninn 評論0 收藏0
  • ES6核心特性

    摘要:報錯不報此外還有個好處就是簡化回調函數正常函數寫法箭頭函數寫法改變指向長期以來,語言的對象一直是一個令人頭痛的問題,在對象方法中使用,必須非常小心。 前言 ES6 雖提供了許多新特性,但我們實際工作中用到頻率較高并不多,根據二八法則,我們應該用百分之八十的精力和時間,好好專研這百分之二十核心特性,將會收到事半功倍的奇效!寫文章不容易,請大家多多支持與關注!本文首發地址GitHub博客(...

    loostudy 評論0 收藏0
  • ES6核心特性

    摘要:報錯不報此外還有個好處就是簡化回調函數正常函數寫法箭頭函數寫法改變指向長期以來,語言的對象一直是一個令人頭痛的問題,在對象方法中使用,必須非常小心。 前言 ES6 雖提供了許多新特性,但我們實際工作中用到頻率較高并不多,根據二八法則,我們應該用百分之八十的精力和時間,好好專研這百分之二十核心特性,將會收到事半功倍的奇效!寫文章不容易,請大家多多支持與關注!本文首發地址GitHub博客(...

    _DangJin 評論0 收藏0

發表評論

0條評論

weij

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<