1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 10:22:23 +00:00

docs(symbol): add an example of Singleton

This commit is contained in:
ruanyf 2016-07-21 21:41:19 +08:00
parent 717ddb15dc
commit 8b9202cd6c
3 changed files with 63 additions and 4 deletions

View File

@ -1,10 +1,10 @@
# ECMAScript 6简介 # ECMAScript 6简介
ECMAScript 6以下简称ES6是JavaScript语言的下一代标准已经在2015年6月正式发布了。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序成为企业级开发语言。 ECMAScript 6.0以下简称ES6是JavaScript语言的下一代标准已经在2015年6月正式发布了。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序成为企业级开发语言。
标准的制定者有计划,以后每年发布一次标准,使用年份作为标准的版本。因为当前版本的ES6是在2015年发布的所以又称ECMAScript 2015。 标准的制定者有计划以后每年发布一次标准使用年份作为版本。因为ES6的第一个版本是在2015年发布的所以又称ECMAScript 2015简称ES2015
2016年6月发布了小幅修订的《ECMAScript 2016 标准》(简称 ES2016。由于变动非常小只新增了数组实例的`includes`方法和指数运算符),因此 ES2016 与 ES2015 基本上是同一个标准,都被看作是 ES6。根据计划2017年6月将发布 ES2017 标准 2016年6月小幅修订的《ECMAScript 2016 标准》(简称 ES2016如期发布。由于变动非常小(只新增了数组实例的`includes`方法和指数运算符),因此 ES2016 与 ES2015 基本上是同一个标准,都被看作是 ES6。根据计划2017年6月将发布 ES2017。
## ECMAScript和JavaScript的关系 ## ECMAScript和JavaScript的关系
@ -14,7 +14,7 @@ ECMAScript 6以下简称ES6是JavaScript语言的下一代标准已经
该标准从一开始就是针对JavaScript语言制定的但是之所以不叫JavaScript有两个原因。一是商标Java是Sun公司的商标根据授权协议只有Netscape公司可以合法地使用JavaScript这个名字且JavaScript本身也已经被Netscape公司注册为商标。二是想体现这门语言的制定者是ECMA不是Netscape这样有利于保证这门语言的开放性和中立性。 该标准从一开始就是针对JavaScript语言制定的但是之所以不叫JavaScript有两个原因。一是商标Java是Sun公司的商标根据授权协议只有Netscape公司可以合法地使用JavaScript这个名字且JavaScript本身也已经被Netscape公司注册为商标。二是想体现这门语言的制定者是ECMA不是Netscape这样有利于保证这门语言的开放性和中立性。
因此ECMAScript和JavaScript的关系是前者是后者的规格后者是前者的一种实现另外的ECMAScript方言还有Jscript和ActionScript日常场合,这两个词是可以互换的。 因此ECMAScript和JavaScript的关系是前者是后者的规格后者是前者的一种实现另外的ECMAScript方言还有Jscript和ActionScript。日常场合这两个词是可以互换的。
## ECMAScript的历史 ## ECMAScript的历史

View File

@ -108,6 +108,7 @@
- Jason Orendorff, [ES6 In Depth: Symbols](https://hacks.mozilla.org/2015/06/es6-in-depth-symbols/) - Jason Orendorff, [ES6 In Depth: Symbols](https://hacks.mozilla.org/2015/06/es6-in-depth-symbols/)
- Keith Cirkel, [Metaprogramming in ES6: Symbols and why they're awesome](http://blog.keithcirkel.co.uk/metaprogramming-in-es6-symbols/): Symbol的深入介绍 - Keith Cirkel, [Metaprogramming in ES6: Symbols and why they're awesome](http://blog.keithcirkel.co.uk/metaprogramming-in-es6-symbols/): Symbol的深入介绍
- Axel Rauschmayer, [Customizing ES6 via well-known symbols](http://www.2ality.com/2015/09/well-known-symbols-es6.html) - Axel Rauschmayer, [Customizing ES6 via well-known symbols](http://www.2ality.com/2015/09/well-known-symbols-es6.html)
- Derick Bailey, [Creating A True Singleton In Node.js, With ES6 Symbols](https://derickbailey.com/2016/03/09/creating-a-true-singleton-in-node-js-with-es6-symbols/)
## 二进制数组 ## 二进制数组

View File

@ -377,6 +377,64 @@ iframe.contentWindow.Symbol.for('foo') === Symbol.for('foo')
上面代码中iframe窗口生成的Symbol值可以在主页面得到。 上面代码中iframe窗口生成的Symbol值可以在主页面得到。
## 实例:模块的 Singleton 模式
Singleton模式指的是调用一个类任何时候返回的都是同一个实例。
对于 Node 来说,模块文件可以看成是一个类。怎么保证每次执行这个模块文件,返回的都是同一个实例呢?
很容易想到,可以把实例放到顶层对象`global`
```javascript
// mod.js
function A() {
this.foo = 'hello';
}
if (!global._foo) {
global._foo = new A();
}
module.exports = global._foo;
```
然后,加载上面的`mod.js`
```javascript
var a = require('./mod.js');
console.log(a.foo);
```
上面代码中,变量`a`任何时候加载的都是`A`的同一个实例。
但是,这里有一个问题,全局变量`global._foo`是可写的,任何文件都可以修改。
```javascript
var a = require('./mod.js');
global._foo = 123;
```
上面的代码,会使得别的脚本加载`mod.js`都失真。
为了防止这种情况出现我们就可以使用Symbol。
```javascript
// mod.js
const FOO_KEY = Symbol.for('foo');
function A() {
this.foo = 'hello';
}
if (!global[FOO_KEY]) {
global[FOO_KEY] = new A();
}
module.exports = global[FOO_KEY];
```
上面代码中,可以保证`global[FOO_KEY]`不会被其他脚本改写。
## 内置的Symbol值 ## 内置的Symbol值
除了定义自己使用的Symbol值以外ES6还提供了11个内置的Symbol值指向语言内部使用的方法。 除了定义自己使用的Symbol值以外ES6还提供了11个内置的Symbol值指向语言内部使用的方法。