最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

對(duì)javascript繼承的理解

 更新時(shí)間:2016年10月11日 16:17:20   投稿:mdxy-dxy  
昨天讀了關(guān)于javascript繼承的幾篇文章,對(duì)原型鏈、construct、this有了新的認(rèn)識(shí)

由于javascript原生是不支持類的(ES6已經(jīng)支持class與extends),更不用談繼承、多態(tài)了,為了模擬出一些其它面向?qū)ο缶幊陶Z(yǔ)言的這些特性,有好多大牛寫了給出了實(shí)現(xiàn)方式,看了John Resig的《Simple JavaScript Inheritance》這篇文章,深深被折服了,原來(lái)短短幾十行javascript也可以這么強(qiáng)大、優(yōu)雅,下面以我的理解方式來(lái)解讀下。

主要實(shí)現(xiàn)了繼承、訪問(wèn)父類的重名方法(這里的實(shí)現(xiàn)方式太妙了),但遺憾的是不能實(shí)現(xiàn)成員變量/函數(shù)的隱藏。

(function(){
  //設(shè)置標(biāo)志位,是new A()過(guò)程中還是 B=A.extends({/*   */})過(guò)程中;
  var initializing = false,
      //fnTest 可取結(jié)果為倆正則對(duì)象 /\b_super\b/與 /.*/
      //當(dāng)正則的test方法參數(shù)支持自動(dòng)調(diào)用toString()方法時(shí)取前面那個(gè)
      fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
    
  // 創(chuàng)建一個(gè)全局的 Class對(duì)象
  this.Class = function(){};
    
  // 創(chuàng)建繼承函數(shù)
  Class.extend = function(prop) {
    //此處把_super指向父類的prototype,屬性繼承時(shí)需要用其判斷父、子是否有同名方法
    var _super = this.prototype;
      
    //開(kāi)始B=A.extends({/*   */});
    initializing = true;
    //實(shí)例化父類,并把父類的實(shí)例方法及屬性給prototype
    var prototype = new this();
    initializing = false;
    //結(jié)束B(niǎo)=A.extends({/*   */});
      
    // 遍歷用戶傳入的用于構(gòu)建子類的對(duì)象
    //處理的地方包括:
    //1、屬性直接存到prototype上
    //2、方法中沒(méi)通過(guò)this._super()調(diào)用父類中的同名方法,則直接把該方法存到prototype上
    //3、方法中有通過(guò)this._super()調(diào)用父類中的同名方法,則把如下過(guò)程包裹成一個(gè)函數(shù)存到prototype上:
    //   把this._super指向父類的同名方法,然后再調(diào)用子類的該方法并返回執(zhí)行結(jié)果
    for (var name in prop) {
      // 循環(huán)體中看起來(lái)略微復(fù)雜,是整個(gè)代碼的精華所在
      //簡(jiǎn)化下此過(guò)程就是  v = a && b && c ? d : e; 等同于 v = (a && b && c) ? d : e
      //該過(guò)程中主要運(yùn)用的就是邏輯運(yùn)算中的短路運(yùn)算 a,b,c全為true則v=d,否則v=e
      //a中判斷prop[name]是否是函數(shù),b中判斷父類中是否也有同名的name函數(shù),c主要判斷name函數(shù)中是否有調(diào)用父類的同名方法(即調(diào)用了this._super())
      //d就是a,b,c同時(shí)滿足的時(shí)候,也就是說(shuō):name是函數(shù),且name函數(shù)存在與父類中,且子類的name函數(shù)需要調(diào)用了父類的同名函數(shù)
      //若a,b,c中有一項(xiàng)不滿足則直接把prop[name]給prototype[name]
      prototype[name] = typeof prop[name] == "function" &&
        typeof _super[name] == "function" && fnTest.test(prop[name]) ?
        (function(name, fn){
          //首先,先決條件決定了prototype[name]是個(gè)函數(shù),所以先包裹一個(gè)函數(shù)返回
          return function() {
            //作者這里備份,然后調(diào)用fn后又還原this._super
            //由于return的是一個(gè)function,具有延時(shí)調(diào)用的作用 所以在子類調(diào)用fn時(shí)this始終指向子類本身
            //而這里的_super是父類的_super,與this._super并無(wú)關(guān)系,所以備份應(yīng)該是多余的
            //var tmp = this._super;
            //this._super指向與fn(即prop[name])同名的父類方法,方便fn內(nèi)部調(diào)用
            //這里是實(shí)現(xiàn)子類中通過(guò)this._super()調(diào)用父類同名函數(shù)的關(guān)鍵
            this._super = _super[name];
            //此時(shí)再調(diào)用子類,子類里面的this._super已經(jīng)指向了父類同名的函數(shù),即_super[name]
            var ret = fn.apply(this, arguments);   
            //this._super = tmp;
            //返回執(zhí)行結(jié)果
            return ret;
          };
        })(name, prop[name]) :
        prop[name];
    }
      
    //此“Class”與外頭那個(gè)“Class”是兩個(gè)東西
    //這個(gè)Class實(shí)為子類的構(gòu)造函數(shù)
    function Class() {
      //不是A.extends({/*   */})過(guò)程中
      if ( !initializing && this.init )
        this.init.apply(this, arguments);
    }
      
    //前面處理好的prototype綁定給子類的prototype
    Class.prototype = prototype;
      
    //修正構(gòu)造函數(shù)
    Class.prototype.constructor = Class;
    
    //賦予子類可被繼續(xù)繼承的功能
    Class.extend = arguments.callee;
      
    return Class;
  };
})();

如果想更深入了解js繼承,請(qǐng)繼續(xù)往下查看文章

相關(guān)文章

  • 圖片上傳之FileAPI與NodeJs

    圖片上傳之FileAPI與NodeJs

    本文主要介紹了使得我們處理圖片上傳更加簡(jiǎn)單的方法FileAPI。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • 通過(guò)js獲取div的background-image屬性

    通過(guò)js獲取div的background-image屬性

    div的background-image這個(gè)屬性,只是設(shè)置它的url,下面為大家介紹下如何獲取它的background-image屬性,感興趣的朋友可以參考下
    2013-10-10
  • JS實(shí)現(xiàn)的點(diǎn)擊按鈕圖片上下滾動(dòng)效果示例

    JS實(shí)現(xiàn)的點(diǎn)擊按鈕圖片上下滾動(dòng)效果示例

    這篇文章主要介紹了JS實(shí)現(xiàn)的點(diǎn)擊按鈕圖片上下滾動(dòng)效果,涉及javascript事件響應(yīng)及頁(yè)面元素屬性動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-01-01
  • 深入學(xué)習(xí)js瀑布流布局

    深入學(xué)習(xí)js瀑布流布局

    這篇文章主要幫助大家深入理解js瀑布流布局,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • JavaScript將base64圖片轉(zhuǎn)換成formData并通過(guò)AJAX提交的實(shí)現(xiàn)方法

    JavaScript將base64圖片轉(zhuǎn)換成formData并通過(guò)AJAX提交的實(shí)現(xiàn)方法

    本文通過(guò)三步驟給大家詳細(xì)介紹了JavaScript將base64圖片轉(zhuǎn)換成formData并通過(guò)AJAX提交的實(shí)現(xiàn)方法,感興趣的朋友一起看看吧
    2016-10-10
  • JavaScript獲取數(shù)據(jù)類型的方法詳解

    JavaScript獲取數(shù)據(jù)類型的方法詳解

    這篇文章給大家介紹了JavaScript獲取數(shù)據(jù)類型的方法,文中所介紹的所有知識(shí)點(diǎn)、代碼示例以及提供的解決方案,均不考慮?IE?瀏覽器,僅支持最新版本的?Chrome、Firefox、Edge?和?Safari?瀏覽器,需要的朋友可以參考下
    2024-02-02
  • JavaScript正則表達(dá)式和級(jí)聯(lián)效果

    JavaScript正則表達(dá)式和級(jí)聯(lián)效果

    正則表達(dá)式(regular expression)是一種字符串匹配的模式,用來(lái)檢查一個(gè)字符串中是否包含指定模式的字符串。下面通過(guò)本文給大家分享JavaScript_正則表達(dá)式和級(jí)聯(lián)效果,感興趣的朋友一起看看吧
    2017-09-09
  • JS的時(shí)間格式化和時(shí)間戳轉(zhuǎn)換函數(shù)示例詳解

    JS的時(shí)間格式化和時(shí)間戳轉(zhuǎn)換函數(shù)示例詳解

    這篇文章主要介紹了JS的時(shí)間格式化和時(shí)間戳轉(zhuǎn)換函數(shù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 原生js實(shí)現(xiàn)半透明遮罩層效果具體代碼

    原生js實(shí)現(xiàn)半透明遮罩層效果具體代碼

    半透明遮罩層效果基本上都是使用插件實(shí)現(xiàn)的,下面為大家分享下使用原生js實(shí)現(xiàn)半透明遮罩效果,感興趣的朋友可以參考下哈,希望對(duì)你熟悉原生js有所幫助
    2013-06-06
  • JS數(shù)字精度丟失的原因及解決方案

    JS數(shù)字精度丟失的原因及解決方案

    JS的數(shù)字類型一旦數(shù)字超過(guò)限值,JS將會(huì)丟失精度,導(dǎo)致前后端的值出現(xiàn)不一致,這篇文章主要給大家介紹了關(guān)于JS數(shù)字精度丟失的原因分析及解決方法,需要的朋友可以參考下
    2022-04-04

最新評(píng)論

抚顺县| 德兴市| 会理县| 白银市| 手游| 宾川县| 诸城市| 青河县| 金川县| 徐州市| 麻江县| 顺昌县| 彩票| 临朐县| 凤庆县| 交城县| 莱州市| 蒙自县| 南投县| 宿迁市| 增城市| 苗栗市| 沿河| 九江市| 全州县| 阿瓦提县| 休宁县| 嘉善县| 固镇县| 虞城县| 谷城县| 清流县| 遂川县| 新蔡县| 昭觉县| 云安县| 仁怀市| 四川省| 利川市| 双鸭山市| 老河口市|