javascript 之 面向對象【繼承】

繼承:函數沒有簽名,沒法實現接口繼承。ECMAScript只支持實現繼承函數

1/原型鏈this

    回顧:構造函數、原型和實例的關係?spa

        回:每一個構造函數都有一個原型對象。原型對象都包含一個指向構造函數的指針。實例都包含一個指向原型對象的內部指針。prototype

案例分享:
function FatherType()
{
     this.F_PanDuan = true;
}
FatherType.prototype.getFatherValue= function () {
     return this.F_PanDuan;
}

function ChildType()
{
     this.C_PanDuan = false;
}
ChildType.prototype = new FatherType();
ChildType.prototype.getChildValue = function ()
{
     return this.C_PanDuan;
}
 var instance = new ChildType();
 alert(instance.getFatherValue()); //true
案例分析:FType 和CType分別有一個屬性和方法,其中CType繼承了FType
理解難點在於:每一個構造函數都有一個原型對象。原型對象都包含一個指向構造函數的指針。實例都包含一個指向原型對象的內部指針。
擴展分析:原型搜索機制。當讀取模式訪問一個實例屬性時,先在實例中搜索該屬性,若沒有該屬性則搜索實例的原型。
那麼這裏會有三個步驟:1/搜索實例 2/搜索ChildType.prototype 3/搜索FatherType.prototype

 

2/肯定原型與實例的關係指針

(1)instanceof操做符code

    alert(instance  instanceof  Object) //true  (其中Object 還能夠是FatherType,ChildType 返回都爲true)對象

(2)isPrototypeOf()blog

  alert(Object.prototype.isPrototypeOf(instance)) //true  (其中Object 還能夠是FatherType,ChildType 返回都爲true)繼承

 3/謹慎地定義方法接口

   接着上面地例子:加一句 //重寫父類型中的方法  ChildType.prototype=getFatherValue=function(){ return false};  結果: alert( instance.getFatherValue())  //false

   還須要注意的是:ChildType.prototype指針已經指向了FatherType,那麼此時ChildType.prototype 就不能指向其餘方法或對象,不然就不是指向FachterType構造函數

4/原型鏈的問題:

(1)包含引用類型值得原型屬性都會被全部實例共享

案例:
function F_Type(){
   this.colors={'red','green','blue'}
}
function C_Type(){}
C_Type.prototype=new F_Type();
var instancel=new C_Type();
instancel.colors.push('black')
alert(instancel.colors) //'red','green','blue','black'

var instancel2=new C_Type()
instancel2.colors.push('black')
alert(instancel.colors) //'red','green','blue','black'

(2)在建立子類型得實例時,不能向父類型的構造函數中傳遞參數

相關文章
相關標籤/搜索