title: 面向对象(八)继承___ 05组合继承 # 文章页面上的显示名
date: # 文章生成时间,一般不改
categories: # 文章分类目录,可省略
- 面向对象
tags: # 文章标签,可省略
- 面向对象
- 基于原型面向对象的继承 # 个数不限,单个可直接跟在 tags 后面
组合继承:原型 + 借用构造函数
01 借用构造函数实现继承:可以获得父构造函数中的实例属性 Person.call(this,name,age)
02 获得原型属性和方法 ( Boy.prototype = Person.prototype)
<script>
function Person(name,age){
this.name = name;
this.age = age;
};
Person.prototype.des = "描述信息";
Person.prototype.logDes = function(){
console.log(this.des);
};
function Boy(bookName,name,age){
this.bookName = bookName;
//Person.call(this,"悟空",600); //借用构造函数
Person.call(this,name,age);
}
//设置原型继承
//Boy.prototype = new Person();
Boy.prototype = Person.prototype;
//创建对象
var boy = new Boy("水煮三国","悟空",600);
var boy02 = new Boy("大话西游","云风",40);
console.log(boy);
console.log(boy02);
boy.logDes();
var p1 = new Person();
p1.logDes();
Boy.prototype.des = "描述信息-bOY";
boy.logDes();
p1.logDes();
</script>
存在问题:原型共享带来的问题
Boy.prototype = Person.prototype 这是一个赋值操作,会把右边的地址复制一份给左边,指向内存中的同一块数据,一个原型对象的属性和方法,对另外一个也会有影响
解决方案:
01借用构造函数,可以获得实例父构造函数的实例属性
02通过深拷贝,把原型对象上面的属性和方法拷贝一份,复制给子对象,即拥有了属性和方法,也不共享了