类与实例
根据慕课视频总结的笔记
类的声明
1.通过构造函数来声明
function Animal(){
this.name=name
}
- 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
完美的结果