• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題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技巧

    來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 21:16:48
    文檔

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

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

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

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

    先看第一個例子
    代碼如下:
    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工具函數(shù)實現(xiàn)了一個基本的原型繼承,每次調(diào)用create都會根據(jù)parent對象去復制一個新對象,新對象全部的屬性都來自于parent。這里parent有三個屬性,都是基本數(shù)據(jù)類型:字符串,數(shù)字,布爾。

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

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

    結(jié)果如下

    即修改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都是引用類型,一個是對象,一個是數(shù)組。child仍然繼承與parent,隨后修改了child,結(jié)果如下

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

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

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

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

    下面是一個滿足以上2點的寫類工具函數(shù)
    代碼如下:
    /**
    * @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很不容易發(fā)現(xiàn)。

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

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

    文檔

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

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

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产精品毛片VA一区二区三区| 精品福利视频一区二区三区| 亚洲国产高清精品线久久| 精品国偷自产在线| 亚洲?V乱码久久精品蜜桃| 欧美日韩精品系列一区二区三区国产一区二区精品 | 国产美女精品一区二区三区| 人妻少妇精品系列| 国产精品乱伦| 99精品视频3| 久久精品人人做人人爽97| 日韩精品一区二区三区视频| 成人午夜精品亚洲日韩| 久久精品综合一区二区三区| 日本欧美韩国日本精品| 99久久人妻无码精品系列| 热re99久久精品国99热| 亚洲精品高清在线| 国产呦小j女精品视频| 亚洲精品电影网| 国产精品亚洲片在线va| 91精品欧美综合在线观看| 全球AV集中精品导航福利| 亚洲精品乱码久久久久久中文字幕| 国内精品视频在线观看| 99riav国产精品| 久久精品成人国产午夜| 国产高清在线精品一本大道| 91精品在线播放| 精品无码久久久久久尤物| 无码人妻精品一区二区三区久久| 看99视频日韩精品| 久久精品视屏| 蜜臀久久99精品久久久久久| 久久久精品国产亚洲成人满18免费网站| 国产成人久久久精品二区三区| 91无码人妻精品一区二区三区L| 91不卡在线精品国产| 98精品国产自产在线XXXX| 成人精品一区二区久久| 国产成人精品免高潮在线观看|