ES6-学习之路-05
用Proxy进行预处理
在运行函数前初始化一些数据,在改变对象值后做一些善后处理。这些都算钩子函数,Proxy的存在就可以让我们给函数加上这样的钩子函数,你也可以理解为在执行方法前预处理一些代码。你可以简单的理解为他是函数或者对象的生命周期。 首先定义对象如下:
let obj = {
add: (val) => {
return val + 100
},
name: 'I am du'
}
console.log(obj.add(10))
console.log(obj.name)
复制代码
声明proxy
用new的方法对Proxy进行声明。可以看一下声明Proxy的基本形式。new Proxy({},{})
以下是定义proxy的完整代码:
/** 定义proxy*/
let pro = new Proxy({
add: (val) => {
return val + 100
},
name: 'I am du'
}, {
get: (target, key, property) => {
console.log('before get')
return target[key]
}
})
console.log(pro.name)
复制代码
get属性
- target:得到的目标值
- key:目标的key值,相当于对象的属性
- property:这个不太常用,用法还在研究中,还请大神指教。
set属性
set属性是值你要改变Proxy属性值时,进行的预先处理。它接收四个参数:
- target:目标值。
- key:目标的Key值。
- value:要改变的值。
- receiver:改变前的原始值。
let pro = new Proxy({
add: (val) => {
return val + 100
},
name: 'I am du'
}, {
get: (target, key, property) => {
console.log('before get')
return target[key]
},
set: (target, key, value, receiver) => {
console.log(`${receiver[key]}=>${value} `)
return target[key] = value
}
})
console.log(pro.name)
pro.name = 'ming'
console.log(pro.name)
输出如下:
before get
proxy.js:28 I am du
proxy.js:20 before get
proxy.js:24 I am du=>ming
proxy.js:20 before get
proxy.js:30 ming
复制代码
apply
apply的作用是调用内部的方法,它使用在方法体是一个匿名函数。
let target = function() {
return 'I am test';
};
var handler = {
apply(target, ctx, args) {
console.log('do apply');
return Reflect.apply(...arguments);
}
}
var pro2 = new Proxy(target, handler);
console.log(pro2());
复制代码
promise使用
ES6中的promise的出现给我们很好的解决了回调地狱的问题,在使用ES5的时候,在多层嵌套回调时,写完的代码层次过多,很难进行维护和二次开发,ES6认识到了这点问题,现在promise的使用,完美解决了这个问题。那我们如何理解promise这个单词在ES5中的作用那,你可以想象他是一种承诺,当它成功时执行一些代码,当它失败时执行一些代码,更符合人类的行为思考习惯。
promise的基本用法
promise执行多步操作非常好用,那我们就来模仿一个多步操作的过程,那就以吃饭为例吧。要想在家吃顿饭,是要经过三个步骤:
- 洗菜做饭。
- 坐下来吃饭。
- 收拾桌子洗碗。
这个过程是有一定的顺序的,你必须保证上一步完成,才能顺利进行下一步,现在用promise来实现。
/**promise的使用 */
let state = 1;
function step1(resolve, reject) {
console.log('1.开始-洗菜做饭');
if (state == 1) {
resolve('洗菜做饭--完成');
} else {
reject('洗菜做饭--出错');
}
}
function step2(resolve, reject) {
console.log('2.开始-坐下来吃饭');
if (state == 1) {
resolve('坐下来吃饭--完成');
} else {
reject('坐下来吃饭--出错');
}
}
function step3(resolve, reject) {
console.log('3.开始-收拾桌子洗完');
if (state == 1) {
resolve('收拾桌子洗完--完成');
} else {
reject('收拾桌子洗完--出错');
}
}
new Promise(step1).then(function(val) {
console.log(val);
return new Promise(step2);
}).then(function(val) {
console.log(val);
return new Promise(step3);
}).then(function(val) {
console.log(val);
return val;
});
复制代码
上面示例代码中,resolve 和 reject是两个函数变量,resole函数在Promise对象执行成功的时候触发,reject函数则在Promise对象执行失败的时候触发,Promise实际上就是前面说过的Proxy。
class类的使用
class的定义见如下代码:
class Code {
name(val) {
console.log(val)
}
}
let code = new Code
code.name('duduming')
console.log(code.name)
复制代码
class类内多函数互相调用:
class Code {
name(val) {
console.log(val)
return val
}
anthorM(val) {
console.log(this.name('test') + ' another method' + val)
}
}
let code = new Code
//code.name('duduming')
code.anthorM('ano')
复制代码
类的构造函数: 通过constructor构造函数,向class内传参,然后在class内的方法中使用参数。
class Code {
name(val) {
console.log(val)
return val
}
anthorM(val) {
console.log(this.name('test') + ' another method' + val)
}
add() {
return this.a + this.b
}
constructor(a, b) {
this.a = a
this.b = b
}
}
let code = new Code(3, 4)
//code.name('duduming')
console.log(code.add())
复制代码
class的继承,通过extends关键字。
class Code {
name(val) {
console.log(val)
return val
}
anthorM(val) {
console.log(this.name('test') + ' another method' + val)
}
add() {
return this.a + this.b
}
constructor(a, b) {
this.a = a
this.b = b
}
}
class SonCode extends Code {
}
let sonCode = new SonCode(3, 4)
//code.name('duduming')
console.log(sonCode.add(4, 5))
复制代码
模块化
export
export可以让我们把变量,函数,对象进行模块话,提供外部调用接口,让外部进行引用。先来看个最简单的例子,把一个变量模块化。我们新建一个temp.js文件,然后在文件中输出一个模块变量。
export default的使用
加上default相当是一个默认的入口。在一个文件里export default只能有一个。我们来对比一下export和export default的区别
- export
export var a ='jspang';
export function add(a,b){
return a+b;
}
复制代码
对应的引入方法:
export var a ='jspang';
export function add(a,b){
return a+b;
}
复制代码
- export default
export default var a='jspang'
复制代码
对应引入方式
import str from './temp';
复制代码