面向对象

本文深入探讨了JavaScript中类的声明及实例化过程,详细解析了三种实现继承的方法:构造函数、原型链以及组合方式,并分析了各自的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类与实例
根据慕课视频总结的笔记
类的声明

1.通过构造函数来声明

function Animal(){
this.name=name
}
  1. ES6的class的声明
class Animal2(){
	construtor(){
		this.name=name
		}
}

生成实例

类与继承
如何实现继承

继承的几种方式
——1. 借助构造函数实现继承

function Parent(){
	this.name='parent'
}

function Child(){
	Parent.call(this)//apply也行,改变函数运行上下文
	this.type='child'
}

原理:将父级的构造函数this指向子构造函数的实例上
局限:父级的原型链并没有被子级改变
如果给父级再加一个

Parent.prototype.say=function(){}

这样的话,子级就没有这种方法
所以,如果父类的属性都在构造函数里面,那就没有问题,可以完全继承;如果父类的原型对象上还有方法的话就没有办法被继承
——2. 借助原型链实现继承

function Parent2(){
this.name='parent2'
}
function Child2(){
this.type='child2'
}
Child2.prototype=new Parent2() //prototype属性的作用就是为了让Child2的实例对象的原型指向Parent2

原理:就是prototype的作用让实例对象的原型指向父类
局限:如果实例了两个对象,改了一个对象,另一个对象也会改变,因为原型链上的原型对象他俩共用的
在这里插入图片描述
s1.proto===s2.proto

——3.组合方式

function Parent3(){
this.name='Parent3'
this.paly=[1,2,3]
}
function Child3(){
Parent3.call(this)
this.type='Child3'
}
Child3.prototype=new Parent3()

缺陷:在实例化子类的时候,父类的构造函数执行了两次,这显得没有必要

优化方式1:
将 Child3.prototype=new Parent3() 改为:

Child.prototype=Parent.proptotype

原理:现在我想继承父类的原型对象,我们就直接给它父类的原型对象就可以了
缺陷:会造成子类的实例对象指向父类原型

优化方式2:
将 Child.prototype=Parent.proptotype 改为:

Child.prototype=Object.create(Parent.prototype)
Child.prototype.constructor=Child

完美的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值