面向对象是一种非常重要的编程思想,三大特性就是继承、多态、封装。JavaScript本身就是面向对象的编程语言,在ES6引入class关键字后,让我们可以更便捷的使用面向对象思想。
1. 封装,即将通用的动作、属性组合为类。
//父类存放通用的属性,动作
class Base {
constructor(context) {
this.name = 'super';
this.requestTime = new Date();
this.context = context;
}
async getById(opts) {
//
}
async findAll() {
//
}
async findByName () {
//
}
async beginTransaction () {
//
}
}
2. 继承,即将通用的动作、属性放入父类,子类包含父类的通用动作、属性的同时,也有自己特殊的动作、属性。
//父类存放通用的属性,动作
class Base {
constructor(context) {
this.name = 'super';
this.requestTime = new Date();
this.context = context;
}
async getById(opts) {
//
}
async findAll() {
//
}
}
//子类包含父类的通用动作、属性,同时也有自己特殊的动作、属性
//将各种独有的动作、属性,放在子类
class User extends Base {
constructor(context) {
super(context);
this.phone = context.phone;
this.login = context.login;
}
async isUserLoginUsed(login) {
//
}
async getById(opts) {
let {table, id} = opts;
let sql = "select id from :table where id = :id";
}
}
3. 多态,即继承自父类的子类之间是有差异性的。
// 此class的方法和上面的方法名完全一致,但是动作却不一样
class User extends Base {
constructor(context) {
super(context);
this.phone = context.phone;
this.login = context.login;
}
async isUserLoginUsed(login) {
//select login from users
}
async isUserPhoneUsed (phone) {
//
}
//虽然和上面的User类都继承同一个父类,且方法名一样,但是动作却是完全不一样
async getById(opts) {
let {table1, table2, id} = opts;
let sql = `select t1.id, t2.name from :table t1, inner join :table2 t2
where t1.id = t2.id and t.id = :id`;
}
}