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>