对象简化
属性简化
对象的属性值来自于对象外的变量,且变量名刚好和属性名相同时,可以参照对象解构中 的简化方式,无需重复写出两个相同的名,写一遍即可。
obj{
属性名:变量名 => 属性名/变量名
//属性名与变量名相同时可省略冒号及后面的变量名
}
方法简化
可以省略:function。
注:由于箭头函数会使this发生变化,对象中的方法不可使用箭头函数简写。
obj{
方法名: function(){...} => 方法名(){...}
}
class
特点
class可以封装一个对象的构造函数与原型对象,使两者定义于同一程序结构中,利于程序的模块化。
当要实现两种类型间的继承时,可以将两者共同的部分封装在上层父类型中集中保存。
封装
class的封装分为三步:
- 创建最外层class,class后跟随类名,即原构造函数名。
- 在class内添加以constructor为名的构造函数。
- 在class内直接添加方法,方法自动保存在构造函数的原型对象中。
class Student2{
constructor(sname,sage){
this.sname = sname;
this.sage = sage;
}
intr(){
console.log(this.sname,this.sage);
}
}
注:封装完成后,使用方法与原构造函数相同,具体见前几篇文章 对象的封装继承和多态。
继承
子类继承父类:
class 子类型 extends 父类型{
super();
...
}
extend可以使子类型继承父类型的原型对象内容,而super()可以调用父类型构造函数,使子类型继承父类的属性私有部分。
两者必须共同使用。
promise
优势
保证多个异步函数,可以顺序执行的机制。优化了异步回调,防止回调地狱。
当我们希望多个异步函数之间相互等待,顺序执行时,直接顺序书写在主程序中式无法达到效果的,每个异步函数都是一条单独的跑道,而主程序是持续执行的,不会等待异步函数执行完毕,如果直接写在主函数中,几个异步函数几乎是同步执行的,当上一个异步函数开始时,下一个函数就开始执行。
传统的解决方法是使用回调函数,将下一个任务作为回调函数传入上一个任务中,在上一个任务的函数末端进行主动调用,将单独的跑道变为了接力跑道,脱离了主程序。
但当连续执行的异步函数非常多时,就会出现多个回调函数嵌套,程序冗长复杂,可读性差,这就是回调地狱。
回调函数嵌套传参的写法是造成回调地狱的根源。
function liang(next){
console.log("亮起跑..");
setTimeout(function(){
console.log("亮终点..");
next();
},6000);
}
function dong(next){
console.log("东起跑..");
setTimeout(function(){
console.log("东终点..");
next();
},6000);
}
function ran(next){
console.log("然起跑..");
setTimeout(function(){
console.log("然终点..");
next();
},6000);
}
console.log("比赛开始!pia!");
//回调函数 实现多个异步顺序执行 嵌套太多形成回调地狱
liang(
//liang next
function(){
dong(
//dong next
function(){
ran(
//ran next
function(){
console.log("比赛结束!");
}
)}
);
}
)
promise
promise可以避免回调地狱的产生,promise的使用也分为三步。
- 创造promise对象:在原函数内部,返回promise对象包裹的函数体。
- 在函数体后添加调用promise的回调函数中的形参,形参名称任意,示例中为para。
function 函数名(){
return new Promise(
function(para){
...
函数体
...
para();
}
)
}
para是一个形参,该参数代表着下一个then中的参数,也就是下一个任务,当我们写para(),代表着下一个任务开始执行,para()也可以携带参数,参数会自动赋给下一个任务的形参。
- 函数调用
前一个异步函数().then(下一个异步函数)
liang()
.then(ran)
.then(dong)
.then(()=>console.log("比赛结束!"));
示例:
function liang(){
return new Promise(
function(door){
var b = "接力棒";
console.log("亮起跑..");
setTimeout(function(){
console.log("亮终点..");
door(b);//传出参数 自动给后续then中形参
},Math.random()*6000);
}
)
}
function ran(b){
return new Promise(
function(door){
var b = "接力棒";
console.log("然起跑..");
setTimeout(function(){
console.log("然终点..");
door(b);//传出参数 自动给后续then中形参
},Math.random()*6000);
}
)
}
function dong(b){
return new Promise(
function(door){
var b = "接力棒";
console.log("东起跑..");
setTimeout(function(){
console.log("东终点..");
door(b);//传出参数 自动给后续then中形参
},Math.random()*6000);
}
)
}
//连锁运行及报错处理
liang()
.then(ran)
.then(dong)
.then(()=>console.log("比赛结束!"));
promise.all
等待多个异步任务完成才执行,
Promise.all([
可以添加函数体和支持promise的函数调用(),
...,
...
]).then(function(arr){ 后续操作...})
then中的参数可以以数组的形式保存Promise.all中的promise函数的返回值,无返回值可省略。