理解javascript中的原型

已經熟悉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
原型和實例不是複製關係,而是協同關係!,附加到了新建立的對象上

未完待續!開發

相關文章
相關標籤/搜索