JS面向对象之继承那些事儿

本文详细探讨JavaScript中的面向对象继承,包括原型链继承、构造函数继承、组合继承、寄生组合继承以及ES6中的class继承。分析了各种继承方式的优缺点,如原型链继承的属性共享问题,构造函数继承无法继承原型属性,组合继承导致父类构造函数被调用两次等。并举例说明实例对象上引用类型和原型对象上引用类型的区别,揭示了JavaScript继承机制的微妙之处。
摘要由CSDN通过智能技术生成

继承就是子类可以使用父类的所有功能,并且对这些功能进行扩展。

原型链继承

function Parent () {
   
  this.name = 'Parent'
  this.sex = 'boy'
}
Parent.prototype.getName = function () {
   
  console.log(this.name)
}
function Child () {
   
  this.name = 'child'
}
Child.prototype = new Parent()//子类的原型指向父类的实例
var child1 = new Child()
child1.getName()//‘child’
console.log(child1)//Child {name:"child"}
  • child1是通过子类构造函数Child生成的对象,拥有自己的属性name,并且属性值也是自己的child
  • 子类的实例可以使用父类实例的所有属性和方法,getName打印出name
  • 由于sexgetName都是Child原型对象上的属性,所以并不会表现在child1上。

原型继承的优缺点

function Parent(name){
   
    this.name=name;
    this.sex='boy';
    this.color=['red']
}
function Child(){
   
    this.friend=['jack']
}
var parent= new Parent('parent')
Child.prototype=parent;//子类原型指向父类实例
var child1=new Child('child1');
child1.sex='girl';
child1.color.push('blue');
child1.friend.push('mimi')
var child2=new Child('child2');

console.log(child1)
console.log(child2)
console.log(child1.name,child1.color)
console.log(parent)

此段代码运行的结果:
在这里插入图片描述

  • child1.sex = 'girl'这段代码相当于是给child1这个实例对象新增了一个sex属性。相当于是:原本没有sex这个属性,我想要获取就得拿原型对象parent上的sex,但是现在你加了一句child1.sex就等于是我自己也有了这个属性了,就不需要你原型上的了,所以并不会影响到原型对象parent上

  • child1.colors这里,是直接使用了.push(),也就是说得先找到colors这个属性,发现实例对象parent上有,然后就拿来用了,之后执行push操作,所以这时候改变的是原型对象parent上的属性,会影响到后续所有的实例对象。(因为操作的方式不同)

  • 而friend它是属于child1实例自身的属性,它添加还是减少都不会影响到其他实例。因此child1打印出了feature和sex两个属性。(name和colors属于原型对象上的属性并不会被表现出来)

  • 虽然我们在new Child的时候传递了’child1’,但接收name属性的是构造函数Parent,而不是Child。child2.colors由于用的也是原型对象parent上的colors,由于之前被child1给改变了,所以打印出来的会是[‘white’, ‘black’, ‘yellow’]。最后的原型对象parent打印出来,name和sex没变,colors却变了。

  • 优点
    1)继承了父类的模板,又继承了父类的原型对象

  • 缺点
    1) 如果要给子类的原型上新增属性和方法,就必须放在Child.prototype = new Parent()这样的语句后面
    2)来自原型对象的所有属性都被共享了,如果不小心修改了原型对象中的引用类型属性,那么所有子类创建的实例对象都会受到影响。
    3)创建子类时,无法向父类构造函数传参数

构造函数继承

function Parent (name) {
   
  this.name = name
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值