# let const
# class
# 继承的n种实现方式
- 原型prototype继承
function Person(name){
this.name=name;
}
Person.prototype.sayName=function(){
console.log(this.name);
}
var p1=new Person("CJ");
p1.sayName();//CJ
- 构造函数实现(类似class中的constructor函数)
function Person(name){
this.name=name;
}
var p1=function(name){
Person.call(this,name);//通过调用Person函数并传递this给this赋值
console.log(this.name);
}
p1("CJ");
- 混合式实现
function Person(name,age){
this.name=name;
this.age=age;
}
Person.prototype.sayName=function(){
console.log(this.name)
}
function Student(name,age){
Person.call(this,name);
}
Student.prototype=new Person();//Student.prototype=Person.prototype;
Student.prototype.constructor=Student;//修复构造函数指向
var s1=new Student("CJ",23);//实例化Student时,原型指向Person原型
s1.sayName();
- ES6类extends继承
class Person{
constructor(name){
this.name=name;
}
}
class Student extends Person{
constructor(name,age){
super(name);//相当于Person.call(name,this)
this.age=age;
}
sayName(){
console.log(this.name);
}
}
var s1=new Student("CJ",23);
s1.sayName()//CJ
# 箭头函数
箭头函数为es6的函数另一种写法,相比原function的写法,箭头函数更能体现参数流向,且箭头函数中的this指向当前所在域的this。
- 箭头函数中没有arguments对象,需使用...args来接受为一个数组。
- 箭头函数this始终指向当前this指向。
- 箭头函数只穿一个参数时可以省略小括号。
- 箭头函数中传参可赋值一个默认参数,如果该参数没有传递时使用默认替代。
var test=(name="JC")=>{
console.log(name);
}
test(); //JC
test("CJ");//CJ
//箭头函数指针
var A =function(){
this.test=function(){
console.log(this)
}
}
var a1 =new A();
a1.test.call(1);//1 function定义的函数的this指向可以使用call,apply,bind来实现
// --------
var A =function(){
this.test=()=>{
console.log(this);
}
}
var a1 =new A();
a1.test.call(1);//A {test: ƒ} 箭头函数this指向无法被改变
# 解构赋值
快速取得对象或数组对应的参数
let [a,b]=[1,2];
console.log(a,b);//1 2
let [c,[d]]=[1,[2]];
console.log(c,d);//1 2
//------------
//对对象取值
let {name}={
name:'CJ',
age:24,
likes:[]
}
console.log(name) //CJ
//使用剩余运算符接收
var {name,...args}={
name:'CJ',
age:24,
likes:[]
}
console.log(name,args) //CJ {age: 24, likes: Array(0)}
# proxy
代理模式:为对象的访问、赋值、属性查找等启用中间层代理,先执行代理的函数,后根据情况返回具体的内容。与Object.defineprotype相似,使用get和set函数对被代理的对象进行操作,但能拦截更多的属性访问钩子。仅说明常用的get和set拦截,更多访问拦截请查看官方文档。
var target = {
name: 'CJ',
likes: ["reading", 'coding']
}
var proxy = new Proxy(target,{
get(target,key,value){
if(key==="age"){
return 23
}else{
return target[key]
}
}
});
# decorator(装饰器)
使用过JAVA应该都会了解装饰器,spring MVC中用来修饰类或者方法,@Controller|@RequestionMapper,对类或则方法功能进行增强。
# generator函数
一直以为会promise和async/await就好了,可以直接跳过generator,果然想法很天真,redux -saga使用了generator函数,最近又在搞懂saga原理的路上艰难前行,先把generator玩通。
# 使用方法
function* gen() {//generator函数在函数申明前使用*号说明该函数是一个异步函数
let r1=yield new Promise((reslove)=>{
setTimeout(()=>{reslove('res1')},1000);
});
let r2=yield new Promise((reslove)=>{
setTimeout(()=>{reslove('res2')},1000);
});
let r3=yield new Promise((reslove)=>{
setTimeout(()=>{reslove('res3')},1000);
});
console.log('gen',r1,r2,r3);
};
是不是感觉这种写法和async/await贼像啊,执行后发现什么都没发生,屁都没放一个
- next:执行gen函数返回的对象后包含的方法,用来调用下次个的yield后的异步函数并放到返回的对象的value中,代码:
var g=gen();
g.next();//执行next会返回一个对象{value: Promise, done: false}
- value:此次yield后的异步函数,通过.then(res=>res)取到返回的值
- done:异步操作是否执行完毕,即接下来是否还有yield执行
var g=gen();
let res= g.next();//开始执行第一个yield 执行next会返回一个对象{value: Promise, done: false}
res.value.then((res)=>{
console.log(res);//取得第一个r1的promise的结果 res1
return g.next(res).value;// 执行next返回下一个promise(r2)
}).then((res)=>{//promise(r2)
console.log(res);//r2的结果 res2
//g.next(res)返回的对象为上一个promise(r2)和done:false
return g.next(res).value;//执行next返回下一个promise(r3)
}).then((res)=>{
console.log(res);//r3的结果 res3
return g.next(res).value;
}).then((res)=>{
console.log(res)//最后一次,已经没有东西了。 undefined
return g.next()//返回{value:undefined,done:true} done为true就代表已经完成啦
})
一直这样写岂不是很麻烦,我们使用函数来迭代处理下
var runGen=function(){
var g=gen();//生成迭代对象
function run(val){
var res=g.next(val);//将值传递给下一次调用
if(res.done){//是否是最后一次(已经完成)
return res.value;//直接返回最后的值
}else{
res.value.then((res)=>{//取得下一次promise返回的结果
console.log(res)
run(res)//再次迭代,直到done为true
});
}
}
run();
}()
← CSS CMD | AMD 规范 →