1、初始化的几种方式
1.1、Proxy关联原始对象
let obj = {
name: 'sian'
}
/**
* new Proxy(target, handler);
* 第一个参数为原始对象
* 第二个参数为拦截行为
*/
let proxy = new Proxy(o[......]
let obj = {
name: 'sian'
}
/**
* new Proxy(target, handler);
* 第一个参数为原始对象
* 第二个参数为拦截行为
*/
let proxy = new Proxy(o[......]
本来是想说说生成器Generator的,但我发现和迭代有关,所以要先讲讲迭代器Iterator,可迭代器又会扯到Symbol,所以拉出来一起说说;
Symbol是ES6引进的一种新数据类型,它代表一个独一无二的值,至此JavaScript一共有7种数据类型,分别是:Undefinded
、String
、Symbol
、Object
、Null
、Number
、boolean
。
Symbol到底是什么?先来个栗子看看效果:
let s1 = Symbol();
let s2 = Symbol();
console.log(s1, typeof s1); // Symbol() "symbol"
console.log(s1 === s2); // false
let s3 = Symbol('symbol');
let s4 = Symbol('symbol');
console.log(s3, s4); // Symbol(symbol) Symbol(symbol)
console.log(s3 === s4); // false
let s5 = Symbol.for('symbol');
let s6 = Symbol.for('symbol');
console.log(s5, s6); // Symbol(symbol) Symbol(symbol)
console.log(s5 === s6); // true
console.log(s4 === s5); // false
new
关键字;既然Symbol的特性代表独一无二,那典型的应用场景就是需要唯一性的场所,比如说枚举值、对象的属性名或方法名等。
* 以性别为例,我们定义一个gender
对象,分别有male
和female
两个属性,我们在应用的时候可能只需要区分这两者不一样即可,并不关心他们实际值是多少,可以将值设置为Symbol类型。(如果需要与服务端交互另说,这里主要是为了说明Symbol的用法,勿喷)
// 性别:常规定义
const gender = {
male: 'male', // 男
female: 'female' // 女
}
// 性别:Symbol定义
const gender = {
male: Symbol(),
female: Symbol()
}
person
对象,我想扩展一个方法,但又不确定新加的方法名是否会引起冲突,所以使用Symbol类型的值做为方法名// person对象
let person = {
name: 'yusian',
age: 21,
say() {
console.log('saying...');
}
}
// 自定义方法名
let methods = {
say: Symbol('say'),
run: Symbol('run')
}
person[methods.say] = function () {
console.log('symbol saying...');
}
person[methods.run] = function () {
console.log('symbol running...');
}
person.say(); // saying...
person[methods.say](); // symbol saying...
person[methods.run](); // symbol running...
Symbol.hasInstance
为例,定义一个Person
类,在类中定义一个静态方法名为Symbol.hasInstance
,那么当对该类进行instanceof
调用时就会执行该静态方法,返回值即为调用返回结果。class Person {
// 方法名一般为字符串,Symbol类型做为方法名需要加方括号
static [Symbol.hasInstance] = function (foo) {
console.log('hasInstance, ', foo);
return false;
}
}
let p = new Person();
console.log(p instanceof Person); // false
参考链接:阮一峰ES6入门
[……]
1、Promise在javascript中的重要性不言而喻,但很多同学并不清楚内部的实现机理,我就我的理解与大家分享一下;
2、最简单的办法就是根据官方的Promise效果来实现相同的效果,我之前也看过网上的相关实现,全篇看到底就懵了,我想能不能出浅入深一步一步来;
3、好了,先实现一个最简单的[……]