JavaScript原型鏈(Prototype)的設計思想

        對於Java語言開發者來講,「對象繼承、父類子類、類和實例」根深蒂固,理解Javascript語言的繼承機制,不免會「轉不過彎來」。閱讀和引用了一些大師們的文章,自我總結一下Javascript爲何設計成「原型鏈」的模式?
  1. 首先從誕生提及,1994年網景公司(Netscape)發佈了Navigator瀏覽器0.9版,爲了讓瀏覽器能夠與網頁互動,工程師Brendan Eich負責開發這種語言,即最初的Javascript。C++是當時最流行的語言,而Java語言也開始風生水起,所以設計者Brendan Eich受到了極大的影響:「Javascript裏面全部的數據類型都是對象(object)」!接下來,如何把對象鏈接起來就要考慮「繼承」了,多是Brendan Eich考慮到不想把javascript搞得那麼複雜(知足基本交互應用便可,或者爲了下降初學者難度),或者認爲不引入「Class」依然能夠設計出更巧妙的模式來,總之,他沒有設計「類Class」的概念。
  2. 仍是從面向對象的思想來設計JavaScript語言。Java裏從原型對象生成一個實例對象:Animal dog = new Animal();於是Brendan Eich使用了new關鍵字;接下來java裏new時會調用「構造函數constructor」,在Javascript裏是這樣設計的,new命令後面跟的不是類,而是「構造函數」,舉例來講:function Animal(name){ this.name=name; },把這個函數對象當成「構造函數」,var dog = new Animal("dog"); alert(dog.name);構造函數中的this關鍵字,表明了新建立的實例對象。還能夠再建一個實例,var cat = new Animal("cat");alert(cat.name),實際上原型對象應該有共性的屬性或方法,例如:function Animal(name){ this.name=name; this.need="air";},此時修改實例對象dog.need="eat";並不會影cat.need;而need是Animal的公共屬性,須要資源保護,不能資源浪費。因此,Brendan Eich決定爲構造函數設置一個prototype屬性,解決這個問題。
  3. 全部須要共享的屬性或方法都放在prototype屬性對象裏,其餘放在構造函數裏。實例對象一旦建立,將自動引用prototype對象的屬性和方法。Animal.prototype={need:"air"};alert(dog.need);因爲全部的實例對象共享同一個prototype對象,那麼從外界看起來,prototype對象就好像是實例對象的原型,而實例對象則好像"繼承"了prototype對象同樣。
相關文章
相關標籤/搜索