title: 面向对象(八)继承___ 07完全拷贝(直接拷贝原型的成员)
date: # 文章生成时间,一般不改
categories: # 文章分类目录,可省略
- 面向对象
tags: # 文章标签,可省略
- 面向对象
- 基于原型面向对象的继承 # 个数不限,单个可直接跟在 tags 后面
完整的继承方案
- 拥有父构造函数的实例属性
- 拥有父构造函数的原型属性
- 是相互独立的,彼此不受影响
<script>
if(typeof Array.isArray != "function") {
Array.isArray = function(obj){
return Object.prototype.toString.call(obj) == "[object Array]";
}
}
function deepCopy(obj1,obj2) {
obj1 = obj1 || {};
for (var i in obj2)
{
if (obj2.hasOwnProperty(i))
{
if( typeof obj2[i] == "object")
{
//判断是数组还是对象
obj1[i] = Array.isArray(obj2[i])?[]:{};
//引用类型
deepCopy(obj1[i],obj2[i]); //函数调用
}else
{
//值类型
obj1[i] = obj2[i];
}
}
}
}
function Person(name,age){
this.name = name;
this.age = age;
};
Person.prototype.des = "描述信息";
Person.prototype.car = {
type:"汽车"
}
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 = Person.prototype;
deepCopy(Boy.prototype,Person.prototype); //把父构造函数原型对象上面的属性和方法全部拷贝一份给Boy
//创建对象
var boy01 = new Boy("水煮三国","悟空",600);
var boy02 = new Boy("大话西游","云风",40);
Boy.prototype.car.type = "火车";
console.log(Boy.prototype);
var p1 = new Person();
console.log(p1.car.type);
</script>