• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    javascript繼承的六大模式小結_javascript技巧

    來源:懂視網 責編:小采 時間:2020-11-27 21:36:56
    文檔

    javascript繼承的六大模式小結_javascript技巧

    javascript繼承的六大模式小結_javascript技巧:1.原型鏈 function SuperType(){ this.property = true; } SuperType.prototype.getSuperValue = function(){ return this.property; }; function SubType(){ this.subproperty = false; } //繼
    推薦度:
    導讀javascript繼承的六大模式小結_javascript技巧:1.原型鏈 function SuperType(){ this.property = true; } SuperType.prototype.getSuperValue = function(){ return this.property; }; function SubType(){ this.subproperty = false; } //繼

    1.原型鏈

    實現的本質是重寫原型對象,代之以一個新類型的實例。

    2.借用構造函數

    如果僅僅是借用構造函數,那么也將無法避免構造函數模式存在的問題——方法都在構造函數中定義,因此函數復用就無從談起了。而且,在超類型的原型中定義的方法,對子類型而言也是不可見的,結果所有類型都只能使用構造函數模式??紤]到這些問題,借用構造函數的技術也是很少單獨使用的。

    3.組合繼承

    在這個例子中,SuperType 構造函數定義了兩個屬性:name 和colors。SuperType 的原型定義了一個方法sayName()。SubType 構造函數在調用SuperType 構造函數時傳入了name 參數,緊接著又定義了它自己的屬性age。然后,將SuperType 的實例賦值給SubType 的原型,然后又在該新原型上定義了方法sayAge()。這樣一來,就可以讓兩個不同的SubType 實例既分別擁有自己屬性——包括colors 屬性,又可以使用相同的方法了。

    組合繼承避免了原型鏈和借用構造函數的缺陷,融合了它們的優點,成為JavaScript 中最常用的繼承模式。而且,instanceof 和isPrototypeOf()也能夠用于識別基于組合繼承創建的對象。

    4.原型式繼承

    在object()函數內部,先創建了一個臨時性的構造函數,然后將傳入的對象作為這個構造函數的原型,最后返回了這個臨時類型的一個新實例。從本質上講,object()對傳入其中的對象執行了一次淺復制。來看下面的例子。

    克羅克福德主張的這種原型式繼承,要求你必須有一個對象可以作為另一個對象的基礎。如果有這么一個對象的話,可以把它傳遞給object()函數,然后再根據具體需求對得到的對象加以修改即可。在這個例子中,可以作為另一個對象基礎的是person 對象,于是我們把它傳入到object()函數中,然后該函數就會返回一個新對象。這個新對象將person 作為原型,所以它的原型中就包含一個基本類型值屬性和一個引用類型值屬性。這意味著person.friends 不僅屬于person 所有,而且也會被anotherPerson以及yetAnotherPerson 共享。實際上,這就相當于又創建了person 對象的兩個副本。

    ECMAScript 5 通過新增Object.create()方法規范化了原型式繼承。這個方法接收兩個參數:一個用作新對象原型的對象和(可選的)一個為新對象定義額外屬性的對象。在傳入一個參數的情況下,Object.create()與object()方法的行為相同。

    Object.create()方法的第二個參數與Object.defineProperties()方法的第二個參數格式相同:每個屬性都是通過自己的描述符定義的。以這種方式指定的任何屬性都會覆蓋原型對象上的同名屬性。例如:

    支持Object.create()方法的瀏覽器有IE9+、Firefox 4+、Safari 5+、Opera 12+和Chrome。

    在沒有必要興師動眾地創建構造函數,而只想讓一個對象與另一個對象保持類似的情況下,原型式繼承是完全可以勝任的。不過別忘了,包含引用類型值的屬性始終都會共享相應的值,就像使用原型模式一樣。

    5.寄生式繼承

    寄生式(parasitic)繼承是與原型式繼承緊密相關的一種思路,并且同樣也是由克羅克福德推而廣之的。寄生式繼承的思路與寄生構造函數和工廠模式類似,即創建一個僅用于封裝繼承過程的函數,該函數在內部以某種方式來增強對象,最后再像真地是它做了所有工作一樣返回對象。以下代碼示范了寄生式繼承模式。

    在這個例子中,createAnother()函數接收了一個參數,也就是將要作為新對象基礎的對象。然后,把這個對象(original)傳遞給object()函數,將返回的結果賦值給clone。再為clone 對象添加一個新方法sayHi(),最后返回clone 對象。可以像下面這樣來使用createAnother()函數:

    這個例子中的代碼基于person 返回了一個新對象——anotherPerson。新對象不僅具有person的所有屬性和方法,而且還有自己的sayHi()方法。
    在主要考慮對象而不是自定義類型和構造函數的情況下,寄生式繼承也是一種有用的模式。前面示范繼承模式時使用的object()函數不是必需的;任何能夠返回新對象的函數都適用于此模式。

    使用寄生式繼承來為對象添加函數,會由于不能做到函數復用而降低效率;這一
    點與構造函數模式類似。

    6.寄生組合式繼承

    前面說過,組合繼承是JavaScript 最常用的繼承模式;不過,它也有自己的不足。組合繼承最大的問題就是無論什么情況下,都會調用兩次超類型構造函數:一次是在創建子類型原型的時候,另一次是在子類型構造函數內部。沒錯,子類型最終會包含超類型對象的全部實例屬性,但我們不得不在調用子類型構造函數時重寫這些屬性。再來看一看下面組合繼承的例子。

    加粗字體的行中是調用SuperType 構造函數的代碼。在第一次調用SuperType 構造函數時,SubType.prototype 會得到兩個屬性:name 和colors;它們都是SuperType 的實例屬性,只不過現在位于SubType 的原型中。當調用SubType 構造函數時,又會調用一次SuperType 構造函數,這一次又在新對象上創建了實例屬性name 和colors。于是,這兩個屬性就屏蔽了原型中的兩個同名屬性。圖6-6 展示了上述過程。
    如圖6-6 所示,有兩組name 和colors 屬性:一組在實例上,一組在SubType 原型中。這就是調用兩次SuperType 構造函數的結果。好在我們已經找到了解決這個問題方法——寄生組合式繼承。

    所謂寄生組合式繼承,即通過借用構造函數來繼承屬性,通過原型鏈的混成形式來繼承方法。其背后的基本思路是:不必為了指定子類型的原型而調用超類型的構造函數,我們所需要的無非就是超類型原型的一個副本而已。本質上,就是使用寄生式繼承來繼承超類型的原型,然后再將結果指定給子類型的原型。寄生組合式繼承的基本模式如下所示。

    這個示例中的inheritPrototype()函數實現了寄生組合式繼承的最簡單形式。這個函數接收兩個參數:子類型構造函數和超類型構造函數。在函數內部,第一步是創建超類型原型的一個副本。第二步是為創建的副本添加constructor 屬性,從而彌補因重寫原型而失去的默認的constructor 屬性。最后一步,將新創建的對象(即副本)賦值給子類型的原型。這樣,我們就可以用調用inherit-Prototype()函數的語句,去替換前面例子中為子類型原型賦值的語句了,例如

    這個例子的高效率體現在它只調用了一次SuperType 構造函數,并且因此避免了在SubType.prototype 上面創建不必要的、多余的屬性。與此同時,原型鏈還能保持不變;因此,還能夠正常使用instanceof 和isPrototypeOf()。開發人員普遍認為寄生組合式繼承是引用類型最理想的繼承范式。

    YUI 的YAHOO.lang.extend()方法采用了寄生組合繼承,從而讓這種模式首次出現在了一個應用非常廣泛的JavaScript 庫中。要了解有關YUI 的更多信息,請訪問http://developer. yahoo.com/yui/。

    以上所述就是本文的全部內容了,希望對大家學習javascript繼承有所幫助。

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    javascript繼承的六大模式小結_javascript技巧

    javascript繼承的六大模式小結_javascript技巧:1.原型鏈 function SuperType(){ this.property = true; } SuperType.prototype.getSuperValue = function(){ return this.property; }; function SubType(){ this.subproperty = false; } //繼
    推薦度:
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 精品乱码久久久久久夜夜嗨 | 精品午夜久久福利大片| 欧美精品在线免费| 色综合久久精品中文字幕首页| 亚洲国产精品无码久久98| 久久精品国产精品亚洲人人 | 精品国产综合成人亚洲区| 无码日韩精品一区二区免费 | 欧美在线精品永久免费播放| 91大神精品全国在线观看| 国产成人精品日本亚洲网站 | 久久国产乱子伦免费精品| 日韩一区二区精品观看| 黄床大片免费30分钟国产精品| 欧美精品一本久久男人的天堂| 国产成人精品高清在线观看93 | 国产在线精品一区二区高清不卡 | 久久99国产精品成人欧美| 97久久精品人人澡人人爽| 久久国产精品久久精品国产| 国内精品久久久久影院日本| 久久棈精品久久久久久噜噜| 伊人久久无码精品中文字幕| 四虎国产精品永久地址入口| 久久精品国产福利国产琪琪| 精品人妻无码专区中文字幕| 国产三级精品三级在线观看| 国产精品久久久久久久午夜片| 四虎影视884a精品国产四虎| 日韩精品一区二区三区四区| 91自慰精品亚洲| 国产欧美精品专区一区二区| 国产三级国产精品国产普男人| 精品国产高清在线拍| 久久国产精品免费一区二区三区| 精品97国产免费人成视频| 久久精品亚洲福利| 香蕉国产精品麻豆亚洲欧美日韩精品自拍欧美v国 | 国产成人AV无码精品| 国产精品成人观看视频网站| 国产精品麻豆VA在线播放|