摘要:本文參考了以下文章之前的文章新特性印象之一新語法面對對象關(guān)鍵字看上面例子就能明白。定義類的,配合創(chuàng)建新對象。繼承非構(gòu)造器對象的原型是。錯誤檢查繼承的目標(biāo)一定要是個對象或者。的構(gòu)造器是可改寫,但不可枚舉。引入了一個標(biāo)簽,負(fù)責(zé)載入模塊。
本文參考了以下文章/PPT:
Use ECMAScript 6 today
Ecmascript 6 Whats next for Javascript
ECMAScript 6: classes
ECMAScript 6 modules: the final syntax
es6features
Javascript Modules
之前的文章:
ECMAScript 6新特性印象之一:新語法
面對對象1.關(guān)鍵字 Class
class Artist { constructor(name) { this.name = name; } perform() { return this.name + " performs "; } } class Singer extends Artist { constructor(name, song) { super.constructor(name); this.song = song; } perform() { return super.perform() + "[" + this.song + "]"; } } let james = new Singer("Etta James", "At last"); james instanceof Artist; // true james instanceof Singer; // true james.perform(); // "Etta James performs [At last]"
看上面例子就能明白。注意幾個關(guān)鍵字extends,super。
雖然ES6的Class本質(zhì)上還是語法糖,但這么設(shè)計有它的目的。
在ES5中, function關(guān)鍵字承擔(dān)著三個職責(zé):
定義函數(shù)。
定義方法屬性。
定義類的constructor,配合new創(chuàng)建新對象。
在ES6中,第2點(diǎn)被屬性方法定義(Method definitions)替代,第3點(diǎn)被Class關(guān)鍵字替代。一個關(guān)鍵字只承擔(dān)一個職責(zé),不再是滿屏function,足夠清晰了吧?
有幾點(diǎn)要注意的:
類的body只能包含屬性方法,不能包含屬性值。屬性值放到constructor方法里。
屬性方法可以是生成器,在方法名前家*就可以。
聲明類(Class Declaration)并不會被提升(hoisted)。
如果沒有指定constructor,那會有個默認(rèn)調(diào)用super的。
2.繼承 Extending
繼承的幾種情況和規(guī)則:
不要繼承空類, class Foo {},因?yàn)椋?/p>
Foo的原型(prototype)是Function.prototype(所有函數(shù)的原型都是這個)。
而Foo.prototype的原型是Object.prototype。
這種繼承就和函數(shù)一樣了。
繼承null:class Foo extends null {}
Foo的原型是Function.prototype。
Foo.prototype的原型是null。
這樣Object.prototype的屬性方法都不會繼承到Foo中。
繼承構(gòu)造器:class Foo extends SomeClass
Foo的原型是SomeClass。
Foo.prototype的SomeClass.prototype。
這樣,類方法屬性也會被繼承。
繼承非構(gòu)造器(對象):class Foo extends SomeObject
Foo的原型是Function.prototype。
Foo.prototype的SomeClass。
錯誤檢查:繼承的目標(biāo)一定要是個對象或者null。如果是繼承構(gòu)造器,那么構(gòu)造器的原型一定要是個對象或者null。
類聲明其實(shí)創(chuàng)建的是可變let綁定(binding,函數(shù)式編程會比較熟悉這個概念)。對于一個類Foo:
Foo的原型是不可改寫,且不可枚舉的。
Foo的構(gòu)造器是可改寫,但不可枚舉。
Foo的原型函數(shù)(Foo.prototype.*)是可改寫,但不可枚舉。
模塊ES6的內(nèi)置模塊系統(tǒng)借鑒了CommonJS和AMD各自的優(yōu)點(diǎn):
具有CommonJS的精簡語法、唯一導(dǎo)出出口(single exports)和循環(huán)依賴(cyclic dependencies)的特點(diǎn)。
類似AMD,支持異步加載和可配置的模塊加載。
不僅僅借鑒,ES6還對這些功能進(jìn)行了優(yōu)化:
語法比CommonJS更精簡。
支持結(jié)構(gòu)的靜態(tài)分析(靜態(tài)檢查,優(yōu)化等等)。
循環(huán)依賴的支持比CommonJS更好。
1.語法
ES6模塊的導(dǎo)出出口形式有兩種:命名導(dǎo)出(一個模塊多個導(dǎo)出)、標(biāo)準(zhǔn)導(dǎo)出(一個模塊一個導(dǎo)出)。
命名導(dǎo)出 Named exports
//-------lib.js---------- export const sqrt = Math.sqrt; export function square(x) { return x * x; } export function diag(x, y) { return sqrt(square(x) + square(y)); } //-------main1.js-------- import { sqaure, diag } from "lib"; console.log(square(11)); // 121 console.log(diag(3,4)); // 5 //或者這樣,命名導(dǎo)入的名稱: //-------main2.js-------- import * as lib from "lib"; console.log(lib.square(11)); // 121 console.log(lib.diag(3,4)); // 5
標(biāo)準(zhǔn)導(dǎo)出 Default exports
//-------MyClass.js----- // 注意,`export`的操作對象是表達(dá)式,一般是沒有名字的。 export default class { ... }; //-------main3.js-------- // 通過模塊名字識別 import MyClass from "MyClass"; let inst = new MyClass();
當(dāng)然,這兩種導(dǎo)出也可以混合使用。本質(zhì)上,標(biāo)準(zhǔn)導(dǎo)出只是指名導(dǎo)出的一種,名稱是「default」而已。
就目前了解的來看,ES6的模塊導(dǎo)出貌似有些繁瑣,還不如CommonJS直接通過object導(dǎo)出利索。
2.設(shè)計初衷 Design goals
TC39在討論ES6的模塊化問題時,主要考慮了下面幾點(diǎn):
直接導(dǎo)出優(yōu)先
靜態(tài)模塊結(jié)構(gòu)
同步/異步載入都要支持
支持循環(huán)依賴
第一點(diǎn)就是要簡單已用。而靜態(tài)模塊結(jié)構(gòu)更多是出于性能優(yōu)化、靜態(tài)類型檢查(沒錯,就是這個,動態(tài)語言為什么要有這個,其實(shí)還是為了性能)和以后的可能會加入的「宏模板」功能。
3.更多導(dǎo)入/導(dǎo)出寫法舉例
導(dǎo)入:
// 標(biāo)準(zhǔn)導(dǎo)入,命名導(dǎo)入 import theDefault, { named1, named2 } from "src/mylib"; import theDefault from from "src/mylib"; import { named1, named2 } from "src/mylib"; // 重命名 import { named1 as myNamed1, named2 } from "src/mylib"; // 將導(dǎo)入的模塊定義為一個對象 // 模塊的每個屬性都是該對象的同名方法屬性 import * as mylib from "src/mylib"; // 僅讀取模塊,不導(dǎo)入任何功能 import "src/mylib";
導(dǎo)出:
// 使用關(guān)鍵字**export**導(dǎo)出 export let myVar1 = ...; export function MyFunc() {...} export function* myGeneratorFunc() {...} // 也可以以對象形式導(dǎo)出 const MY_CONST = ...; function myFunc() { ... } export { MY_CONST, myFunc } // 當(dāng)然,名字不一定要相同 export { MY_CONST as THE_CONST, myFunc as theFunc }; // 支持重導(dǎo)出,即在當(dāng)前模塊導(dǎo)出其他模塊的功能 方便hack export * from "src/other_module"; export { foo, bar } from "src/other_module";
上面說的這些語法,普通的標(biāo)簽是不支持的。ES6引入了一個
4.模塊元數(shù)據(jù)
不僅僅是導(dǎo)入別的數(shù)據(jù),ES6還能通過導(dǎo)入當(dāng)前模塊拿到當(dāng)前模塊的信息:
import { url } from this module; console.log(url);
這就像Ruby里的____FILENAME____。
5.模塊載入接口 Module loader API
API自然是為了通過代碼控制模塊載入的,算是多少彌補(bǔ)了靜態(tài)結(jié)構(gòu)靈活上上的缺陷。
每個瀏覽器平臺都會有一個名為System的全局變量,通過這個變量調(diào)用相應(yīng)接口,異步載入模塊(結(jié)合ES6的promises):
System.import("some_module") .then(some_module => { ... }) .catch(error => { ... }) //當(dāng)然也可以一次載入多個模塊 Promise.all( ["module1", "module2", "module3"] ).map(x => Symtem.import(x))) .then(function([module1, module2, module3]) { ... });
其他接口:
System.module(source, options?)將source中的代碼求值成一個模塊。
System.set(name, module)注冊一個通過System.module生成的模塊。
System.define(name, source, options?)前兩個接口的結(jié)合。
更多關(guān)于模塊的說明
請看看Yehuda Katz的這一篇:Javascript Modules。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/87619.html
摘要:下例實(shí)現(xiàn)了一個數(shù)組的迭代器在中,可迭代數(shù)據(jù)結(jié)構(gòu)比如數(shù)組都必須實(shí)現(xiàn)一個名為的方法,該方法返回一個該結(jié)構(gòu)元素的迭代器。原話是還可以傳遞返回值。 前記 按照規(guī)劃,明年年中,ECMAScript 6(ES6)就要正式發(fā)布了。 最近抽空看了Dr. Axel Rauschmayer的幾篇文章和演講PPT,對新特性有了些了解。 趁沒忘,抓緊記錄下,夾雜自己的感受。 計劃分三部分: 新語法...
摘要:插件開發(fā)前端掘金作者原文地址譯者插件是為應(yīng)用添加全局功能的一種強(qiáng)大而且簡單的方式。提供了與使用掌控異步前端掘金教你使用在行代碼內(nèi)優(yōu)雅的實(shí)現(xiàn)文件分片斷點(diǎn)續(xù)傳。 Vue.js 插件開發(fā) - 前端 - 掘金作者:Joshua Bemenderfer原文地址: creating-custom-plugins譯者:jeneser Vue.js插件是為應(yīng)用添加全局功能的一種強(qiáng)大而且簡單的方式。插....
摘要:將轉(zhuǎn)換成常見的使用實(shí)現(xiàn)的基于迭代器的迭代。處停止迭代器基于鴨子模型接口這里使用語法僅僅為了說明問題使用支持為了使用迭代器屬性需要引入。生成器是迭代器的子類,包含了附加的與。 原文地址:http://babeljs.io/docs/learn-...本文基于Luke Hoban精妙的文章《es6features》,請把star獻(xiàn)給他,你可以在此嘗試這些特性REPL。 概述 ECMAScr...
摘要:今天對于處理異步調(diào)用已經(jīng)有了很多成熟的方案,在我看來這些方案都無外乎在解決一個問題如何能看似順序地傳遞異步調(diào)用的結(jié)果,本文要說的就是原生提供的一個解決方案。在對進(jìn)行敘述之前,依舊引用阮大的入門一書中的章節(jié)便于大家更嚴(yán)謹(jǐn)和全面的學(xué)習(xí)和參考。 異步回調(diào)的泥潭 異步回調(diào)是最直接的異步結(jié)果處理模式,將一個回調(diào)函數(shù)callback扔進(jìn)異步處理函數(shù)中,當(dāng)異步處理獲得結(jié)果之后再調(diào)用這個回調(diào)函數(shù)就可以...
摘要:正大力推進(jìn),網(wǎng)景通訊公司即將與他們達(dá)成一項(xiàng)協(xié)議,讓可以用在瀏覽器上。年月,網(wǎng)景通訊公司和達(dá)成協(xié)議將被重新命名為,它將會作為瀏覽器中小型客戶端任務(wù)的一種腳本語言,同時將會被提升為一種更大的開發(fā)富組件的專業(yè)工具。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事審校: 為之漫筆鏈接:http://www.zcfy.cc/article/2389原文:https://auth0.com/blog/a-...
閱讀 3653·2021-10-11 10:58
閱讀 2245·2021-10-08 10:05
閱讀 2024·2021-09-27 13:34
閱讀 3558·2019-08-30 15:53
閱讀 2723·2019-08-30 14:02
閱讀 3551·2019-08-29 16:55
閱讀 614·2019-08-29 15:41
閱讀 1062·2019-08-29 15:23