<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答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:16:48
        文檔

        淺析JavaScript原型繼承的陷阱_javascript技巧

        淺析JavaScript原型繼承的陷阱_javascript技巧:JavaScript默認采用原型繼承。雖然沒有類(class)的概念,它的函數(function)可以充當構造器(constructor)。構造器結合this,new可以構建出類似Java的類。因此,JavaScript通過擴展自身能模擬類式(class-based)繼承。 JavaScript和其
        推薦度:
        導讀淺析JavaScript原型繼承的陷阱_javascript技巧:JavaScript默認采用原型繼承。雖然沒有類(class)的概念,它的函數(function)可以充當構造器(constructor)。構造器結合this,new可以構建出類似Java的類。因此,JavaScript通過擴展自身能模擬類式(class-based)繼承。 JavaScript和其

        JavaScript默認采用原型繼承。雖然沒有類(class)的概念,它的函數(function)可以充當構造器(constructor)。構造器結合this,new可以構建出類似Java的類。因此,JavaScript通過擴展自身能模擬類式(class-based)繼承。

        JavaScript和其它面向對象語言一樣,對象類型采用引用方式。持有對象的變量只是一個地址,而基本類型數據是值。當原型上存儲對象時,就可能有一些陷阱。

        先看第一個例子
        代碼如下:
        var create = function() {
        function Fn() {}
        return function(parent) {
        Fn.prototype = parent
        return new Fn
        }
        }()

        var parent = {
        name: 'jack',
        age: 30,
        isMarried: false
        }
        var child = create(parent)
        console.log(child)

        create工具函數實現了一個基本的原型繼承,每次調用create都會根據parent對象去復制一個新對象,新對象全部的屬性都來自于parent。這里parent有三個屬性,都是基本數據類型:字符串,數字,布爾。

        這時修改child看看會不會影響parent
        代碼如下:
        child.name = 'lily'
        child.age = 20,
        child.isMarried = true

        console.log(child)
        console.log(parent)

        結果如下

        即修改child不會影響到parent。

        再看看另外一個例子
        代碼如下:
        var create = function() {
        function Fn() {}
        return function(parent) {
        Fn.prototype = parent
        return new Fn
        }
        }()

        var parent = {
        data: {
        name: 'jack',
        age: 30,
        isMarried: false
        },
        language: ['Java']
        }
        var child = create(parent)

        child.data.name = 'lily'
        child.data.age = 20
        child.data.isMarried = true
        child.language.push('javascript')
        console.dir(child)
        console.dir(parent)

        注意這里的parent的兩個屬性data,language都是引用類型,一個是對象,一個是數組。child仍然繼承與parent,隨后修改了child,結果如下

        可以看到,此時parent也被修改了,和child的name,age等都一樣了。這是使用原型繼承時需要注意的。

        使用繼承時比較好的方式是:

        1,數據屬性采用類式繼承(掛在this上),這樣new時也可以通過參數配置

        2,方法采用原型繼承,這樣能節省內存,同時子類重寫方法也不會影響父類

        下面是一個滿足以上2點的寫類工具函數
        代碼如下:
        /**
        * @param {String} className
        * @param {String/Function} superCls
        * @param {Function} factory
        */
        function $class(name, superClass, factory) {
        if (superClass === '') superClass = Object
        function clazz() {
        if (typeof this.init === 'function') {
        this.init.apply(this, arguments)
        }
        }
        var p = clazz.prototype = new superCls
        clazz.prototype.constructor = clazz
        clazz.prototype.className = className
        var supr = superCls.prototype
        window[className] = clazz
        factory.call(p, supr)
        }

        對象類型放在父類原型上時務必小心子類修改其,這時繼承于該父類的所有子類的實例都將被修改。而這造成的bug很不容易發現。

        ES5中加入了一個新API用來實現原型繼承:Object.create。可以用它替代上面自實現的create函數,如下
        代碼如下:
        var parent = {
        name: 'jack',
        age: 30,
        isMarried: false
        }
        var child = Object.create(parent)
        console.log(child)

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

        文檔

        淺析JavaScript原型繼承的陷阱_javascript技巧

        淺析JavaScript原型繼承的陷阱_javascript技巧:JavaScript默認采用原型繼承。雖然沒有類(class)的概念,它的函數(function)可以充當構造器(constructor)。構造器結合this,new可以構建出類似Java的類。因此,JavaScript通過擴展自身能模擬類式(class-based)繼承。 JavaScript和其
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 免费无码黄网站在线观看| 在线永久免费的视频草莓| 国产大片线上免费看| 亚洲综合国产成人丁香五月激情| 99re这里有免费视频精品| 亚洲黑人嫩小videos| 天天影院成人免费观看| 国产成人亚洲精品| 精品国产麻豆免费网站| 丰满亚洲大尺度无码无码专线| 日本一道综合久久aⅴ免费| 国产精品观看在线亚洲人成网| 日美韩电影免费看| 免费福利在线观看| 久久亚洲欧洲国产综合| a毛片免费在线观看| 婷婷亚洲综合五月天小说| 亚洲精品免费视频| 亚洲午夜精品在线| 日韩精品视频免费观看| 男女猛烈xx00免费视频试看| 久久亚洲AV无码西西人体| 免费成人在线电影| 亚洲首页国产精品丝袜| 全免费a级毛片免费**视频 | 亚洲中文字幕AV在天堂| 国产禁女女网站免费看| 午夜在线免费视频| 久久精品国产亚洲AV无码娇色| 18禁超污无遮挡无码免费网站国产 | 日本二区免费一片黄2019| 一个人看的www在线免费视频| 亚洲精品线在线观看| 成人一a毛片免费视频| 午夜免费国产体验区免费的| 久久精品国产亚洲AV大全| 国产一区二区视频免费| 久久久久久免费一区二区三区| 亚洲不卡中文字幕| 久久精品亚洲男人的天堂| 精品成在人线AV无码免费看 |