Symbol
//我简单理解这个东西就是可以做唯一标识,也可以不是
var s1 = Symbol('s1) //这就是唯一的
var s2 = Symbol.for('s2') //这个就不是唯一的了
var obj = {
[s1] : 'aaa'
}
var obj2 = {}
var obj[s1] = 'bbb'
内置Symbol的11个值?
// 阮大师的话我真没理解啥意思。。。
// 我理解这个就是对原生一些方法的拦截,不执行源生方法改执行自己的,所以如果想实现功能必须自己写代码完成
// 1. hasInstance
class MyClass {
[Symbol.hasInstance](foo) {
return foo instanceof Array;
}
}
[1, 2, 3] instanceof new MyClass() // true
//当MyClass被当作是否为另外一个实例的构造函数比较时,hasInstance会执行
// 2. isConcatSpreadable
var a = [1, 2]
var b = [3, 4]
var c = a.concat(b) //[1, 2, 3, 4]
b[Symbol.isConcatSpreadable] = false // 这里属性有3个值 undefined和true 这俩是一个意思, 还有个false就是不分解合并。
a.concat(b) // [1, 2, [3, 4]] // 不分解合并就成这样了
// 3. species 通过这个函数的返回值来创建实例
class MyArray extends Array {
static get [Symbol.species]() { return Array; }
}
let a = new MyArray(1,2,3);
let mapped = a.map(x => x * x);
a instanceof MyArray // true
a instanceof Array // true
mapped instanceof MyArray // false
mapped instanceof Array // true
// 4. match
class MyMatcher {
[Symbol.match](string) {
//实现match
var reg = new RegExp(string)
return 'hello world'.match(reg) //内部必须实现match并把结果返回出去。
//return 'hello world'.indexOf(string); //阮前辈的案例
}
}
'e'.match(new MyMatcher())
// 5. replace
const x = {};
x[Symbol.replace] = (...s) => console.log(s);
//能得到这个结果,说明...s结构了2个参数,一个是'Hello',一个是'World'
'Hello'.replace(x, 'World') // ["Hello", "World"]
//为了完成替换功能,改了一下demo
const x = {};
x[Symbol.replace] = (s1, s2) => {
var str = '__'
console.log('s1:', s1) //Hello
console.log('s2:', s2) //World
return s1.replace(str, s2)
};
console.log('Hello __'.replace(x, 'World')) // ["Hello", "World"]
// 6. search //搜索时的 'foobar'.search(new MySearch('foo')) // 0
// 7. split //分割时的 'foobar'.split(new MySplitter('baz'))
// 8. iterator //for..of 解构时的 [...myIterable], for(let value of myCollection) {}
// 9. toPrimitive //转为原始类型的值时会执行 Number,String, Default
2 * obj // 246
3 + obj // '3default'
obj == 'default' // true
String(obj) // 'str'
// 10. unscopables
//这个东西和with密不可分。
var obj = {
a: 1,
b: 2
}
//with的作用就是在打括号里可以直接使用该对象的属性或方法,
with(obj) {
console.log(a)
console.log(b)
}
//unscopables,这货就是不让你在with里用。。。仅此而已
//看下 阮大师的案例
// 没有 unscopables 时
class MyClass {
foo() {
return 1;
}
}
var foo = function() {
return 2;
};
with(MyClass.prototype) {
foo(); // 1
}
// 有 unscopables 时
class MyClass {
foo() {
return 1;
}
get[Symbol.unscopables]() {
return {
foo: true
};
}
}
var foo = function() {
return 2;
};
with(MyClass.prototype) {
foo(); // 2
}