已經熟悉Javascript的開發者可能會認爲原型和對象的關係很親密,可是這全都與函數有關,原型雖然是定義對象的一種很方便的方式,可是它的本質依然是函數特性。
做爲Javascript中的一個方便方式,使用原型所定義的屬性會變成實例化對象的屬性,從而做爲複雜對象建立的概覽。
全部函數在初始化的時候都有一個prototype屬性,該屬性的初始值是一個空對象,只有函數在做爲構造器(constructor)的時候,prototype屬性纔會返回更大的做用,使用new關鍵字調用一個函數,使得該函數能夠做爲構造器進行實例化,併產生一個新的空對象實例做爲其上下文
上面看不懂不要緊下面咱們就用幾個例子來理解一下原型函數
建立新對象最簡單的方法只有一條語句this
var o = {};//並能夠爲他添加一些屬性 o.name = 'Li li';//添加name屬性 o.age = '28'; //添加age屬性 o.skill = 'english';//添加skill屬性 //也能夠以下面這樣寫\ var o { o.name = 'Li li'; o.age = '28'; o.skill = 'english'; }
上面咱們演示瞭如何建立一個對象併爲之添加三個屬性,那麼若是咱們要建立多個相同類型的對象實例,分別對屬性進行賦值,不只代碼冗長,還很是容易出錯。此處下面在說prototype
咱們先開看代碼code
function Person () {} Person.prototype.dance = function () { return true } var person = new Person; console.log(person.dance())//true
讓咱們看看發生了什麼? 使用new操做符將其做爲構造器進行調用,構造函數被調用,而且新建立了一個對象也就是他的實例,新建立的函數成了構造函數的上下文,new操做符返回的結果就是對新建立的對象的引用對象
使用new操做符將函數做爲構造器進行調用的時候,其上下文被定義新對象實例,意味着除了經過原型給附加屬性的形式意外,咱們還能夠在構造函數內經過this參數初始化值。ip
function Person () { this.swing = false;//false this.isSwing = function() {return !this.swing}//true Person.prototype .isSwing = function(){ return this.swing } var person = new Person; console.log(person.swing) //構造函數和原型同時存在同一方法,結果會是哪一個呢?構造函數的方法優先!person會先在構造函數中找swing,若是沒有在去查找原型,若是原型尚未那返回undifined 原型和實例不是複製關係,而是協同關係!,附加到了新建立的對象上
未完待續!開發