//原型(prototype):原型是一個對象,其餘對象能夠經過它實現屬性繼承
/*筆記:
* 1.類式繼承:經過原型鏈繼承的方式
* 2.原型式繼承:對類式繼承的封裝
* 3.寄生式繼承:對原型繼承的二次封裝,而且在第二次封裝過程當中對繼承的對象進行擴展
* 4.構造函數式繼承:經過構造函數繼承的方式
* 5.寄生組合式繼承:寄生式繼承融合構造函數式繼承的優勢去除缺點的方式
* 6.組合式繼承(類式繼承+構造函數式繼承 二者優勢相加)
*/
//原型式繼承
function inheritobject(o){
//聲明一個過渡函數對象
function F(){
}
//過渡原型對象繼承父對象
F.prototype=o;
//返回過渡對象的一個實列,該實例的原型繼承了父對象
return new F();
}
var book={
name:"jsbook",
alikeBook:['css book',"html book"],
};
//寄生式繼承(對原型繼承的第二次封裝,而且在第二次封裝過程當中對繼承的對象進行了擴展)
//聲明基對象
function createBook(obj){
//經過原型繼承方式建立新對象
var o = new inheritobject(obj);
//擴展新對象
o.getName=function(){
console.log(this.name);
}
//返回擴展後的對象
return o;
}
/*
*寄生式繼承 繼承原型
* 傳遞參數subclass 子類
* 傳遞參數superclass 父類
* */
function inheritPrototype(subclass,superclass){
//複製一份父類的原型副本保存在變量中
var p=inheritobject(superclass.prototype);
//修正由於重寫子類原型致使子類的constructor屬性被修改
p.constructor=subclass;
//設置子類原型
subclass.prototype=p;
}
//定義父類
function superclass(name){
this.name = name;
this.colors=["red","blue","green"];
}
//定義父類原型方法
superclass.prototype.getName=function(){
console.log(this.name);
}
//定義子類
function subclass(name,time){
//構造函數式繼承
superclass.call(this,name);
//子類新增屬性
this.time=time;
}
//寄生式繼承父類原型
inheritPrototype(subclass,superclass);
//子類新增原型方法
subclass.prototype.getTime = function(){
console.log(this.time);
}
//單繼承 extend 屬性複製
var extend=function(target,source){
//遍歷源對象中的屬性
for(var property in source){
//將源對象中的屬性複製到目標對象中
target[property]=source[property];
}
return target;
}
//多繼承 屬性複製 能夠綁定到原生對象object上
Object.prototype.mix=function(){
var i=0,//從第一個參數起爲被繼承的對象
len=arguments.length,//arguments至關於多個傳遞參數的集合,很是相似數組
//target=arguments[0];//第一個傳入參數爲目標對象
arg; //緩存參數對象
//遍歷被繼承的對象
for(; i<len;i++){
//緩存當前對象
arg=arguments[i];
for(var property in arg){
//將被繼承對象中的屬性複製到目標對象中
this[property]=arg[property];
}
}
}
//測試單繼承
var b1={
name:'javascript 設計模式',
alike:['css','html','javascript']
}
var b2={
color:'blue'
}
extend(b2,b1);
console.log("單繼承測試:"+b2.name+"-"+b2.alike+"-"+b2.color);
/*寄生組合式繼承測試 begin*/
console.log("寄生組合式繼承測試");
var instance1=new subclass("js book",2014);
var instance2=new subclass("css book",2013);
instance1.colors.push("black");
console.log(instance1.colors);
console.log(instance2.colors);
instance1.getName();
instance1.getTime();
instance2.getName();
instance2.getTime();
/*寄生組合式繼承測試 end*/
/*寄生式繼承測試 begin*/
console.log("寄生式繼承測試");
var newBook=createBook(book);
newBook.name="ajax book";
newBook.alikeBook.push("xml book");
var otherBook=createBook(book);
otherBook.name="flash book";
otherBook.alikeBook.push("as book");
console.log(newBook.name);
console.log(newBook.alikeBook);
newBook.getName();//對對象進行了二次封裝,並進行了擴展
console.log(otherBook.name);
console.log(otherBook.alikeBook);
otherBook.getName();
/*寄生式繼承測試 end*/
/*json對象 測試*/
console.log(book.name+":"+book.alikeBook);
//測試多繼承
otherBook.mix(b1,b2);
console.log(otherBook);javascript