ECMAScript Overview JS綜述

ECMAScript Overview JS綜述

原文地址 www.ecma-international.org

ECMAScript 前端的同學應該比較熟悉, 是制定JS規範的 Specification. 下文中的 ECMAScript 可以當作JS.
今天, 簡單讀了一下 Overview 一節, 有一些收穫, 這裏翻譯並加上了一定自己的理解(有增減), 分享給大家.

之後, 想着翻譯一下 6.1.7 The Object Type (如果有時間, 且想的起來的話…)

Overview

這一節包含了 ECMAScript 的非標準的綜述.

ECMAScript 是一個面向對象的編程語言. 它在宿主環境下, 執行計算和操作可計算的對象.
這裏定義的ECMAScript, 並不打算在計算上完全靠自己. (有一部分依賴於宿主環境, 例如瀏覽器,node)
在specification中沒有規定 外部數據的輸入 或者 計算結果的輸出.
相對應的, ECMAScript 程序的計算環境不僅提供本規範中描述的這些對象和其它的設施, 也還提供特定環境的特定對象.
除了指出他們可能提供某些屬性,可以訪問和某些函數,可以調用從ECMAScript程序, 這些描述和行爲超出了這篇specification的範圍之外.

ECMAScript 原來被設計爲用於腳本語言, 但是現在已經變成了有廣泛用途的編程語言.
一個腳本語言是用於在一個現有的系統中進行操作,自定義和自動化設備的編程語言.
在這樣的系統中,有用的功能已經通過用戶接口可用,而腳本語言是一種用於向程序控制暴露該功能的機制.
通過這種方式, 現有的系統提供一個對象和設施的宿主(host)環境 , 它完善了腳本語言的能力.

ECMAScript 原本被設計爲 Web 腳本語言, 提供一種機制來可以使web頁面更爲靈活和在 Web-based client-server結構中執行一部分計算.
ECMAScript 現在被用於在多樣的宿主環境中提供核心的腳本能力.
因此, 在文檔中指定的核心語言與特殊的宿主環境無關.

Web Scripting

一個web瀏覽器提供了一個 ECMAScript 用於客戶端計算的宿主環境, 包括用於展示窗口的對象, 菜單, 彈框, 錨點, 框架, 歷史, cookies 等等.
進一步說, 這個宿主環境提供了一個手段來把腳本代碼附加給事件. 例如焦點的改變, 頁面和圖片的加載,出錯,取消,表單的提交,鼠標的行爲.
腳本代碼出現在HTML中, 展示的頁面是用戶界面元素,固定和計算的文本圖片的結合.
腳本代碼是對用戶交互是由響應的, 並且不需要一個主程序.

一個web服務器提供了不同的宿主環境用於服務端的計算, 包括表示請求的對象, 客戶端和文件.
這些機制鎖住和分享對象.
通過使用一起使用瀏覽器端和服務端的腳本, 當給web-base的應用提供一個自定義的用戶界面,
在客戶端和服務器之間分發計算結果是有可能的.

每一個支持ECMAScript的web瀏覽器和服務器提供自己的宿主環境, 使ECMAScript的執行環境變得完整.

ECMAScript Overview

下面是一個ECMAScript非正式的綜述, 它並非標準論文的一部分.

ECMAScript 是面向對象的. 基礎的語言和宿主的設備通過對象來提供. 並且 ECMAScript程序是一個通信對象的集羣.
在 ECMAScript, 一個對象是0或者多個屬性(properties)集合(collection), 每個屬性通過特徵(attributes)來決定每個屬性如何使用.

例如, 當一個屬性的 Writable 特徵被設置爲 false, 那麼任務嘗試執行代碼來給這個屬性分配值的操作都會失敗.
屬性是擁有其它對象, 原始類型值, 或者 函數的容器 (container).

原始類型值(primitive value) 是下面集中內置的類型

  • Undefined
  • Null
  • Boolean
  • Number
  • BigInt
  • String
  • Symbol

對象是內置類型 Object 的一員, 函數(function)是可以調用的對象.
通過屬性與對象關聯的函數稱爲方法

ECMAScript定義了一個內置對象集合, 它完善了ECMAScript實體的定義. 這些內置對象包括
下面這些對象對於語言

  • 全局對象 (global object)
  • 運行時語義(runtime semantics) 的基礎, 包括Object, Function, Boolean, Symbol, 和一些 Error 對象
  • 用於操作和展示數學相關的對象: Math, Number, and Date;
  • 文本處理對象: String and RegExp
  • 有索引的集合 (indexed collections): Array 和 9種不同類型的 Array, 其元素均具有特定的數值數據表示
  • keyed collections 鍵值對對象 有 Map , Set 等;
  • 結構化對象: JSON 對象, ArrayBuffer, SharedArrayBuffer, 和 DataView;
  • 支持控制抽象化(control abstractions) 有 生成器函數 (generator functions) 和 Promise 對象
  • 反射的對象: Proxy 和 Reflect.

ECMAScript 也定義了一系列的 內置操作符(built-in operators). 它們包括:

  • 各種的 一元操作符 unary operation
  • 乘法運算符 multiplicative operators
  • 加法運算符 additive operators
  • 按位移位運算符 bitwise shift operators
  • 相等運算符 equality operators
  • 二進制按位運算符 binary bitwise operators
  • 二進制邏輯運算符 binary logical operators
  • 賦值運算符 assignment operators
  • 逗號運算符 comma operator

大型的 ECMAScript 程序通過 modules 可以被一個程序被分爲多個語句和聲明的序列.
每一個模塊都顯式地確定了聲明(declarations). 這些聲明說明了模塊中引入其它模塊的內容, 和哪些內容可以被其它模塊引入.

ECMAScript 語法故意地模仿了Java的語法. ECMAScript語法很寬鬆,可以作爲一種易於使用的腳本語言使用.
例如, 一個變量不需要聲明它的類型,類型也不需要與屬性關聯,定義的函數也不需要在調用它們之前以文本形式顯示它們的聲明。

Objects

儘管 ECMAScript 有着 class的定義方式, ECMAScript 對象並不是 class-based (基於類)的, 它不像C++ 或者 Java.
相反, 對象可能被多重方式創建

  • 字面量 {}
  • 構造器 (constructor)

構造器, 它創建了對象, 之後執行代碼. 通過賦初始值始來初始化所有或者一部分屬性(properties).

構造器是一個函數, 它有一個屬性 prototype 用於實現 基於原型 (prototype-based) 的繼承和可分享的屬性.
對象可以通過構造器或者 new 表達式來創建.
例如 new Date(2009, 11) 創建了一個新的 Date對象.

不通過 new 表達式來調用一個構造器的結果取決於這個構造器.
例如直接 Date() 就會返回一個表示當前日期的字符串, 而非對象.

構造函數創建的每個對象都有一個 隱式引用 implicit reference (稱爲對象的原型),該引用指向構造函數的 prototype 屬性的值。
此外,原型可以具有對其原型的非空隱式引用,等等;

這被稱爲 原型鏈.

當引用對象中的屬性時,該引用是對原型鏈中包含該名稱屬性的第一個對象中的同名屬性的引用。換句話說,
首先,對直接提到的客體進行這種性質的審查;如果該對象包含命名的屬性,則該屬性就是引用所引用的屬性;如果該對象不包含命名屬性,接下來將檢查該對象的原型;等等。

上面這段話, 看起來實在是晦澀.
舉個例子吧

class Car {
  name(){
    console.log('name')
  }
}

let benz = new Car()
benz.name()
benz.toString()
benz.hello()

代碼中, Car 是一個 (其實是一個函數, 只是JS爲了模擬類, 而特意提供的寫法)
benz.name() 會去調用 Car.prototype 中定義的 name 方法.

benz.toString() 會先去找 Car.prototype 中定義的 toString() 方法,
沒有找到, 那就繼續向 Car.prototypeprototype 中去找. 最終在Object的prototype中找打了.就執行它.

benz.hello() 會重複上面的步驟, 但是找到Object,發現還是找不到. 那麼就會報錯 benz.hello is not a function


在一個 基於類的面嚮對象語言(例如Java).
一般來說, 狀態(state) 是由實例來攜帶的. 方法(method) 是由class來攜帶的.
並且, 繼承的只有結構和行爲(structure and behaviour)

但是, 在ECMAScript 狀態和方法都是由對象攜帶的. 同時, 結構,行爲和狀態都是可以繼承的.

所有不直接包含其原型包含的特定屬性的對象,共享該屬性及其值。

原文: All objects that do not directly contain a particular property that their prototype contains share that property and its value.

不像大多數基於類的語言, ECMAScript中屬性可以動態地添加到對象中.也就是說,構造函數不需要爲所構造對象的所有或任何屬性命名或賦值.

儘管ECMAScript對象本質上不是基於類的,但是基於構造函數、原型對象和方法的公共模式來定義類抽象通常很方便。
ECMAScript內置對象本身遵循這樣一個類模式。從ECMAScript 2015開始,ECMAScript語言包括了語法類定義,允許程序員簡明地定義符合內置對象使用的相同類抽象模式的對象。

class MyArr extends Array {

}

例如, 我們可以對一些內置對象進行拓展.

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