下一代javascript的幾個特性

新一代的javascript也被稱爲ECMAScript 6(也稱爲 ES6 or Harmony)給我們帶來很多令人意想不到的功能,在這裏我們花費幾分鐘來學習一下其中重要的功能。

糖語法

首先,語法糖是一種語法,使得語言更容易理解和更具有可讀性,它使語言相對我們來說變得更"甜"。這也意味着ES6的一些"新"的特點並不是真的新,只是試圖簡化語法而已,讓我們編程更容易。這樣就無需使用老式的取巧的方法編寫你的代碼,而是可以一種更簡單的方式來編寫代碼,那就是使用糖語法。

javascript並不像其他面嚮對象語言一樣支持類這個概念,相反js使用function和prototype模擬類的概念。

下面是創建類的新語法,如果你有來自Java或其他OO語言的背景你會很熟悉:

class Project {

  constructor(name) {

    this.name = name;

  }

 

  start() {

    return "Project " + this.name + " starting";

  }

}

 

var project = new Project("Journal");

project.start(); // "Project Journal starting"

你在這個類中定義的所有方法都被加入這個類的原型prototype中。

既然JS不支持類,那麼它支持繼承嗎?

是的,JS中繼承是通過prototype實現。下面是WebProject子類繼承Project類的代碼:

class WebProject extends Project {

  constructor(name, technologies) {

    super(name);

    this.technologies = technologies;

  }

 

  info() {

    return this.name + " uses " + arrayToString(this.technology);

  }

}

 

function arrayToString(param) {

  // ... some implementation

}

 

var webJournal = new WebProject("FrontEnd Journal", "javascript");

webJournal.start(); // "FrontEnd Journal starting"

webJournal.info(); // "FrontEnd Journal uses javascript"

注意到在WebProject 構造器中,調用了Project的構造器,這樣可以使用它的屬性和方法。

 

模塊Module

如果你想將所有js放在一個文件中,或者你要在應用的不同地方使用相同的功能,你就要使用模塊,記住魔術的關鍵詞是export,在你的函數之前使用export。

假設Project 和 WebProject 都儲存在application.js文件中,如下源碼結構:

myproject (folder)

 |

 -- modules (folder)

 |   |

 |   -- helpers.js

 |

 -- application.js

如果我們從application.js中分離arrayToString(),然後放入modules/helpers.js,這樣我們在其他地方可以重用它:

// modules/helper.js

export function arrayToString(param) {

  // some implementation

}

這樣我們只需要導入我們的模塊即可:

// application.js

import { arrayToString } from 'modules/helpers';

 

class WebProject extends Project {

  constructor(name, technologies) {

    super(name);

    this.technologies = technology;

  }

 

  info() {

    return this.name + " uses " + arrayToString(this.technology);

  }

}

 

// ...

let和const

ES6中有兩個新特性:let和 const,爲了理解let,我們需要記住var是創建函數生存期內的變量:

function printName() {

  if(true) {

    var name = "Rafael";

  }

  console.log(name); // Rafael

}

不像Java或其他語言,任何變量在JS中是在一個函數內創建,它會升級到哦函數之外部,不管你在哪裏定義變量,都和你在函數頂部定義一樣,這個行爲稱爲hoisting。

上面代碼用下面方式容易理解些:

function printName() {

  var name; // variable declaration is hoisted to the top

  if(true) {

    name = "Rafael";

  }

  console.log(name); // Rafael

}

那麼let是如何工作呢,和hoisting有什麼關係,我們導入let的代碼如下:

function printName() {

  if(true) {

    let name = "Rafael";

  }

  console.log(name); // ReferenceError: name is not defined

}

let是在一個代碼塊內,變量名只能在代碼塊中可見。

function printName() {

  var name = "Hey";

  if(true) {

    let name = "Rafael";

    console.log(name); // Rafael

  }

  console.log(name); // Hey

}

總結:var是function-scoped,而let是 block-scoped.

const是創建常量使用,一旦創建就一直不會被概念,如下:

const SERVER_URL = "http://www.jdon.com"

ES6還有其他新功能:Map, WeakMap, generators 和Proxies

那麼什麼時候可以使用ES6這些特性呢?可見下面這個網址:

http://kangax.github.com/es5-compat-table/es6/

Node.JS的ES6特性可見:ES6 for Node

 



[轉自www.jdon.com的js語言學習教程

發佈了43 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章