国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專(zhuān)題視頻專(zhuān)題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專(zhuān)題1關(guān)鍵字專(zhuān)題50關(guān)鍵字專(zhuān)題500關(guān)鍵字專(zhuā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)鍵字專(zhuān)題關(guān)鍵字專(zhuān)題tag2tag3文章專(zhuān)題文章專(zhuān)題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專(zhuān)題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

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

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 21:16:48
文檔

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

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

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

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

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

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

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

結(jié)果如下

即修改child不會(huì)影響到parent。

再看看另外一個(gè)例子
代碼如下:
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的兩個(gè)屬性data,language都是引用類(lèi)型,一個(gè)是對(duì)象,一個(gè)是數(shù)組。child仍然繼承與parent,隨后修改了child,結(jié)果如下

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

使用繼承時(shí)比較好的方式是:

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

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

下面是一個(gè)滿足以上2點(diǎn)的寫(xiě)類(lèi)工具函數(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)
}

對(duì)象類(lèi)型放在父類(lèi)原型上時(shí)務(wù)必小心子類(lèi)修改其,這時(shí)繼承于該父類(lèi)的所有子類(lèi)的實(shí)例都將被修改。而這造成的bug很不容易發(fā)現(xiàn)。

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

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

文檔

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

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

最新推薦

猜你喜歡

熱門(mén)推薦

專(zhuān)題
Top
主站蜘蛛池模板: 日韩欧美在线综合 | 日韩午夜免费视频 | 日韩视频免费在线观看 | 欧美第五页| 日韩欧美国产中文字幕 | 精品日韩一区 | 波多野吉衣在线观看 | 九九久久亚洲综合久久久 | 亚洲欧洲免费视频 | 亚洲综合欧美 | 日本一区二区三区高清在线观看 | 亚洲欧美日韩激情在线观看 | 国产亚洲一区二区三区不卡 | 亚洲一区日韩二区欧美三区 | 久久综合精品国产一区二区三区无 | 日韩高清在线高清免费 | 91精品专区| 自拍 欧美 日韩 | 在线播放精品一区二区啪视频 | 日韩欧美亚洲国产高清在线 | 日韩视频在线免费观看 | 国产一区二区三区久久 | 久久一区二区精品综合 | 欧美日韩亚洲一区二区三区 | 2020精品极品国产色在线观看 | 日韩综合网站 | 九一毛片 | 日本一区二区三区视频在线观看 | 精品国产一区二区三区2021 | 欧美第一页在线观看 | 国产 日韩 欧美 在线 | 国产l精品国产亚洲区在线观看 | 日韩在线视频免费 | 精品国产免费一区二区三区五区 | 亚洲欧洲精品成人久久曰影片 | 日韩亚洲第一页 | 九九九国产在线 | 日韩在线网 | 亚洲永久精品一区二区三区 | 亚洲欧美综合网 | 亚洲欧美综合另类 |