类和类的继承问题【原型链继承】

最近在研究js中类与类继承方面的知识,主要是这一块很陌生,所以发现原型继承里面有这样一段代码【代码如下】:

// 原型链继承实现
function Animal(){
    this.x = '父类'
}
Animal.prototype.breathe= function breathe(){ return '呼吸' }
function Cat(){
    this.x = '子类'
}
// 让子类的原型对象指向父类的实例
Cat.prototype = new Animal
Cat.prototype.eat= function eat(){ return '吃' }

// 创建一个子类的实例对象
let a = new Cat()
console.log(a)  // a实例上有子类的属性,原型上有子类定义的方法,由于原型指向父类,所以原型上有父类的属性,该原型上还有父类的原型方法

让子类的原型对象指向父类的实例?当时就不明白了,父类的实例?大家都应该清楚,创建一个实例应该是使用new关键字吧,但是后面要带括号呀,所以去搜索了一下这带括号和不带括号的区别,但是感觉不是能说服自己的结果【懂的都懂】

js中new函数后带括号和不带括号的区别

主要总结为以下两点:

1、通过new Animal().x可以访问到属性x的值,因为new Animal().x相当于(new Animal()).x
2、但是通过new Animal.x访问不到,因为new Animal.x相当于new (Animal.x)

通过原型链实现继承的缺点:

子类实例修改引用类型值,会影响其他子类实例(但若不是引用类型就没有问题)

`产生这个问题的主要原因是由于子类实例访问的是同一个父类的原型对象,引用类型的地址指向同一个堆内存的值`
// 不明白可以了解一下深拷贝和浅拷贝或者基础数据类型和引用数据类型在内存中存储的区别【都是面试官会问的哦】
function Animal(){
    this.x = '父类'
    this.arr = [1, 2, 3]
}
function Cat(){
    this.x = '子类'
}
// 让子类的原型对象指向父类的实例
Cat.prototype = new Animal
Cat.prototype.eat= function eat(){ return '吃' }

// 创建一个子类的实例对象
let a = new Cat()
let b = new Cat()
a.arr.push(4)
console.log(a,b)

a 和 b 输出展示:


如图所示
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容