@wh1100717
2015-02-02T06:06:07.000000Z
字数 2447
阅读 503
ECMAScript
数据大学
通过Symbols我们可以实现Object对象的访问控制。我们知道对象其实是键值对的集合,而键可以是字符串(ES5)或者Symbol。Symbol是新的基本类型。
Symbol 通过调用Symbol()函数产生,它接收一个可选的名字参数name
(主要用来进行调试,并不作为定义的一部分),该函数返回的symbol是唯一的。之后就可以用这个返回值做为对象的键了。Symbol还可以用来创建私有属性,外部无法直接访问由symbol做为键的属性值。
(function() {
// module scoped symbol
var key = Symbol("key");
function MyClass(privateData) {
this[key] = privateData;
}
MyClass.prototype = {
doStuff: function() {
... this[key] ...
}
};
})();
var c = new MyClass("hello")
c["key"] === undefined
在ES6中,内置的像 Array
, Date
和 DOM 元素等可以用来作为基类。
被称为 Ctor
函数的对象构建经过两个阶段:
Ctor[@@create]
来分配对象。
// Array 伪代码
class Array {
constructor(...args) { /* ... */ }
static [Symbol.create]() {
// Install special [[DefineOwnProperty]]
// to magically update 'length'
}
}
// Array 基类的扩展
class MyArray extends Array {
constructor(...args) { super(...args); }
}
// 使用new的两个阶段:
// 1) 调用@@create来分配对象
// 2) 在新实例中唤醒构造函数
var arr = new MyArray();
arr[1] = 12;
arr.length == 2
更多内容请参考 http://www.2ality.com/2013/03/subclassing-builtins-es6.html
在ES6中增加了许多新的API,包括核心Math库,Array conversion helpers,用于对象拷贝的Object.assign
等。
Number.EPSILON
Number.isInteger(Infinity) // false
Number.isNaN("NaN") // false
Math.acosh(3) // 1.762747174039086
Math.hypot(3, 4) // 5
Math.imul(Math.pow(2, 32) - 1, Math.pow(2, 32) - 2) // 2
"abcde".contains("cd") // true
"abc".repeat(3) // "abcabcabc"
Array.from(document.querySelectorAll('*')) // Returns a real Array
Array.of(1, 2, 3) // Similar to new Array(...), but without special one-arg behavior
[0, 0, 0].fill(7, 1) // [0,7,7]
[1,2,3].findIndex(x => x == 2) // 1
["a", "b", "c"].entries() // iterator [0, "a"], [1,"b"], [2,"c"]
["a", "b", "c"].keys() // iterator 0, 1, 2
["a", "b", "c"].values() // iterator "a", "b", "c"
Object.assign(Point, { origin: new Point(0,0) })
ES6中为二级制(b)和八进制(o)增加了两个新的数字字面量格式。
0b111110111 === 503 // true
0o767 === 503 // true
Promises是用来处理异步编程的库,已经有很多第三方库对其进行了来实现。
//创建promise
var promise = new Promise(function(resolve, reject) {
// 进行一些异步或耗时操作
if ( /*如果成功 */ ) {
resolve("Stuff worked!");
} else {
reject(Error("It broke"));
}
});
//绑定处理程序
promise.then(function(result) {
//promise成功的话会执行这里
console.log(result); // "Stuff worked!"
}, function(err) {
//promise失败会执行这里
console.log(err); // Error: "It broke"
});
更多Promises信息请访问:
尾部的函数调用保证了堆栈不会无限增长,使得递归算法在面对无限制输入时变得安全可靠。
function factorial(n, acc = 1) {
'use strict';
if (n <= 1) return acc;
return factorial(n - 1, n * acc);
}
// 目前大部分的实现都会导致栈溢出
// 但是在ES6中对于任意输入都是安全的。
factorial(100000)