1.原型链继承
function Animal(name){
this.name = name || 'Animal';
this.food='菜';
this.skill=['吃饭','睡觉','打豆豆']
this.sleep = function(){
console.log(this.name+'睡了晚安')
}
}
// 在原型上添加一个方法
Animal.prototype.eat = function(food){
console.log(this.name + '吃'+this.food)
}
function Dog(name){
}
Dog.prototype = new Animal('跑啦')
let paola = new Dog()
console.log(paola)
输出结果为:
通过原型链的继承,我们可以使用原型上的东西,那么我们new出来的一个实例需要在原型的基础上进行修改时,则会遇到一个问题:
function Animal(name){
this.name = name || 'Animal';
this.food='菜';
this.skill=['吃饭','睡觉','打豆豆']
this.sleep = function(){
console.log(this.name+'睡了晚安')
}
}
// 在原型上添加一个方法
Animal.prototype.eat = function(food){
console.log(this.name + '吃'+this.food)
}
function Dog(name){
}
Dog.prototype = new Animal('跑啦')
let paola = new Dog()
let xiaoPaola = new Dog()
xiaoPaola.skill.push('乱尿尿')
console.log(xiaoPaola,'小跑啦,技能乱尿')
console.log(paola,'跑啦')
new了一个小跑啦,并且技能是:乱尿尿,直接修改了小跑啦的技能数组,此时我输出:paola和xiaopaola
此时paola的技能也存在了‘乱尿尿’
原型链继承特点:如果你的属性以堆的形式(引用数据类型)存储,则会影响到其他的实例
2.构造函数继承
function Animal(name){
this.name = name || 'Animal';
this.food='菜';
this.skill=['吃饭','睡觉','打豆豆']
this.sleep = function(){
console.log(this.name+'睡了晚安')
}
}
// 在原型上添加一个方法
Animal.prototype.eat = function(food){
console.log(this.name + '吃'+this.food)
}
function Dog(name){
//改变this指向继承
Animal.call(this,name)
}
let paola = new Dog('跑啦')
let xiaoPaola = new Dog('小跑啦啦')
console.log(xiaoPaola,'小跑啦')
console.log(paola,'跑啦')
输出:
那么试一下如果我修改小跑啦的技能,是否会影响到跑啦这个实例呢?
很明显,他没有同原型链继承一样,修改引用数据类型的原型属性没有影响其他实例。
但是!他没有继承prototype里的方法eat!!
3.组合继承
function Animal(name){
this.name = name || 'Animal';
this.food='菜';
this.skill=['吃饭','睡觉','打豆豆']
this.sleep = function(){
console.log(this.name+'睡了晚安')
}
}
// 在原型上添加一个方法
Animal.prototype.eat = function(food){
console.log(this.name + '吃'+this.food)
}
function Dog(name){
//改变this指向继承
Animal.call(this,name)
}
//获取animal的原型上的方法
Dog.prototype = new Animal()
let paola = new Dog('跑啦')
let xiaoPaola = new Dog('小跑啦啦')
// 再添加一次乱尿尿技能
xiaoPaola.skill.push('乱尿尿')
console.log(xiaoPaola,'小跑啦')
console.log(paola,'跑啦')
console.log(xiaoPaola.eat());
console.log(paola.eat());
看这样是完全规避了前面两个继承方式的缺点
同样他也有不足的点:将Animal实例化了两次:call以及在prototype上new了一次
总结
写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于 java开发 的学习思路及方向。从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的Gitee获取。
还有 高级java全套视频教程 java进阶架构师 视频+资料+代码+面试题!
全方面的java进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)