1. 程式人生 > >面向物件(2 )建構函式 原型 原型鏈的理解

面向物件(2 )建構函式 原型 原型鏈的理解

                                      面向物件(2) 原型 原型鏈的理解

1.面向物件的目的就是生成物件object。

2.生成物件的方式

  (1)單例模式(字面量定義)var obj={}

  (2)類的例項 var obj=new Object()

  (3)工廠模式

  (4)建構函式

    

   工廠模式和建構函式的區別?

    工廠模式,生成的物件必須要返回,建構函式模式不用return,建構函式模式預設return旳是this,在建構函式內的this就是例項物件。

    建構函式如果人為return的不是物件,直接忽略,如果人為return的是物件,就取代this。

    工廠模式生成的例項物件的__proto__直接指向基類object的原型;

    建構函式生成的例項物件的__proto__指向它父類的原型,然後父類的原型上的__proto__指向基類object的原型。

    每個例項和例項之間都是獨立的個體,它們之間的的屬性互不干擾,是不等的,如果例項和例項之間的屬性相等,則這個屬性必須是父類的原型上的屬性。是因為父類原型上的屬性是可繼承的,共享的。

原型鏈:

  在操作obj.屬性的時候,首先看這個屬性是私有的還是從父類的原型上繼承的,如果是私有的直接使用,如果私有的沒有就檢視父類的原型上有沒有,如果有就直接使用,如果沒有 就再次向父類的父類的原型上查詢,一直查到基類object為止,如果object也沒有就得到undefined,這就是原型鏈。

  

 

  例項的__proto__上的屬性

  

instanceof  判斷物件是不是這個類的例項物件;

isPrototypeOf() 判斷例項物件是否是父類的原型

getPrototypeOf() 獲取例項物件的原型;

hasOwnProperty() 判斷一個屬性是不是自身(私有)的屬性

in 判斷1一個山西是不是這個物件上的不管是私有的還是公有的

例項物件的原型就是他父類的原型

 

 3.如果不給類的原型指定一個物件,這個例項物件的__proto__上有一個constructor屬性;

 如果給這個類的原型指定了一個物件,例項上的__proto__就沒有constructor屬性了。

建構函式裡和原型裡的this都指向例項物件

This指向問題:

  (1)this是一個物件,函式外的this都指向window;

  (2)函式內的this,它的指向跟函式呼叫有關,看函式得前面有沒有點,有點就指向點前面的物件,沒有就指向window;

  (3)定時器的this永遠是window,自執行函式裡的this是window

  (4)建構函式裡的this和原型上的this都指向例項物件

改變this指向的方法:

  提前將this賦值;

  call;

  apply       call和apply執行是一樣的都是將前面函式內的this改成第一個引數,然後執行前面的函式,不同在從第二個函式開始 apply是一個數組;

  bind bind只改變前面函式的this,但是不執行前面的函式,需要加一個()才執行繼承。

 

繼承

  (1)call繼承 子類繼承父類;

     將父類的私有屬性繼承為子類的私有屬性

     

  (2)原型繼承 將父類的私有和公有屬性都繼承為子類的公有屬性

     子類的原型=父類的例項 B。prototype=new A()