聊聊js中的继承

js是可以面向对象的,自然少不了继承,js实现继承的方式有好几种,这里做一些记录

原型继承

function Super(name){
    this.name = name
    this.color = ['red','blue']
}
Super.prototype.addColor = function(color){
    this.color.push(color)
}
function Sub(){}
Sub.prototype  = new Super()
Sub.prototype.constructor = Sub

let sub1 = new Sub('mike')
let sub2 = new Sub('jake')
console.log(sub1.color) // ['red','blue']
sub2.addColor('black')
console.log(sub1.color) // ['red','blue','black']

复制代码

原型继承的原理就是让子类的原型成为父类的示例,这样子类就可以共享父类的方法,需要注意重新给constructor赋值,这种继承的缺点有两个:

  • 1 无法在实例化子类时自定义构造参数
  • 2 子类实例共享引用类型属性,如上所示,sub2改变color会影响sub1
构造函数继承
function Super(name){
    this.name = name
    this.sayName = function(){ console.log(this.name)}
}

function Sub(name){
    Super.call(this,name)
}

let sub = new Sub('mike')
sub.sayName() // mike
复制代码

可以看到,构造函数继承就是将父类函数在子类中执行一遍,此时引用类型属性不再共享,构造参数可自定义,可缺点也很明显,每个子类重新创建了父类的方法,不存在共享。

组合继承

结合以上两种方法便有了组合继承

function Super(name){
    this.name = name
    this.color = ['red','blue']
}
Super.prototype.addColor = function(color){
    this.color.push(color)
}
function Sub(name,age){
    Super.call(this,name)
    this.age = age
}
Sub.prototype  = new Super()
Sub.prototype.constructor = Sub
let sub1 = new Sub('mike')
let sub2 = new Sub('jake')
console.log(sub1.color)  // ['red','blue']
sub2.addColor('black')
console.log(sub1.color)  // ['red','blue']
复制代码

父类方法在子类中共享,引用属性不共享,构造参数可自定义,ok了?这里还有一个问题,这种方法执行了两次父类构造函数,如果父类的构造函数代码特别多就不太好了。

寄生组合继承
function Super(name){
    this.name = name
    this.color = ['red','blue']
}
Super.prototype.addColor = function(color){
    this.color.push(color)
}
function Sub(name,age){
    Super.call(this,name)
    this.age = age
}
Sub.prototype  = Object.create(Super.prototype)
Sub.prototype.constructor = Sub
复制代码

通过object.create方法直接将Sub.prototype链到Super.prototype实现方法继承又不必执行一次父类构造函数,Object.create可以这样实现:

Object.create = function(obj){
    function F(){}
    F.prototype = obj
    return new F()
}
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
疫情居家办公系统管理系统按照操作主体分为管理员和用户。管理员的功能包括办公设备管理、部门信息管理、字典管理、公告信息管理、请假信息管理、签到信息管理、留言管理、外出报备管理、薪资管理、用户管理、公司资料管理、管理员管理。用户的功能等。该系统采用了MySQL数据库,Java语言,Spring Boot框架等技术进行编程实现。 疫情居家办公系统管理系统可以提高疫情居家办公系统信息管理问题的解决效率,优化疫情居家办公系统信息处理流程,保证疫情居家办公系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理疫情居家办公系统信息,包括外出报备管理,培训管理,签到管理,薪资管理等,可以管理公告。 外出报备管理界面,管理员在外出报备管理界面可以对界面显示,可以对外出报备信息的外出报备状态进行查看,可以添加新的外出报备信息等。签到管理界面,管理员在签到管理界面查看签到种类信息,签到描述信息,新增签到信息等。公告管理界面,管理员在公告管理界面新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值