电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

js中實現繼承的五種方法

瀏覽:88日期:2024-04-06 17:27:22
借用構造函數

這種技術的基本思想很簡單,就是在子類型構造函數的內部調用超類型的構造函數。另外,函數只不過是在特定環境中執行代碼的對象,因此通過使用apply()和call()方法也可以在新創建的對象上執行構造函數。

function Box(name){ this.name = name}Box.prototype.age = 18function Desk(name){ Box.call(this, name) // 對象冒充,對象冒充只能繼承構造里的信息}var desk = new Desk(’ccc’)console.log(desk.name) // --> cccconsole.log(desk.age) // --> undefined

從中可以看到,繼承來的只有實例屬性,而原型上的屬性是訪問不到的。這種模式解決了兩個問題,就是可以傳參,可以繼承,但是沒有原型,就沒有辦法復用。

組合繼承

function Box(name){ this.name = name}Box.prototype.run = function (){ console.log(this.name + ’正在運行...’)}function Desk(name){ Box.call(this, name) // 對象冒充}Desk.prototype = new Box() // 原型鏈var desk = new Desk(’ccc’)console.log(desk.name) // --> cccdesk.run() // --> ccc正在運行...

這種繼承方式的思路是:用使用原型鏈的方式來實現對原型屬性和方法的繼承,而通過借用構造函數來實現對實例屬性的繼承。

原型式繼承

原型式繼承:是借助原型可以基于已有的對象創建新對象,同時還不必因此創建自定義類型。講到這里必須得提到一個人,道格拉斯·克羅克福德在2006年寫的一篇文章《Prototype inheritance in Javascript》(Javascript中的原型式繼承)中給出了一個方法:

function object(o) { //傳遞一個字面量函數 function F(){} //創建一個構造函數 F.prototype = o; //把字面量函數賦值給構造函數的原型 return new F() //最終返回出實例化的構造函數}

看如下的例子:

function obj(o) { function F (){} F.prototype = o; return new F()}var box = { name: ’ccc’, age: 18, family: [’哥哥’,’姐姐’]}var box1 = obj(box)console.log(box1.name) // --> cccbox1.family.push(’妹妹’)console.log(box1.family) // --> ['哥哥', '姐姐', '妹妹']var box2 = obj(box)console.log(box2.family) // --> ['哥哥', '姐姐', '妹妹']

因為上述的代碼的實現邏輯跟原型鏈繼承很類似,所以里面的引用數組,即family屬性被共享了。

寄生式繼承

function obj(o) { function F (){} F.prototype = o; return new F()}function create(o){ var clone = obj(o) // 通過調用函數創建一個新對象 clone.sayName = function(){ // 以某種方式來增強這個對象 console.log(’hi’) } return clone // 返回這個對象}var person = { name: ’ccc’, friends: [’aa’,’bb’]}var anotherPerson = create(person)anotherPerson.sayName() // --> hi

這個例子中的代碼基于person返回一個新對象————anotherPerson。新對象不僅具有person的所有屬性和方法,而且還有自己的sayHi()方法。在主要考慮對象而不是自定義類型和構造函數的情況下,寄生式繼承也是一種有用的模式。使用寄生式繼承來為對象添加函數,會由于不能做到函數復用而降低效率,這一點與構造函數模式類似。

寄生組合式繼承

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

function SuperType(name){ this.name = name; this.colors = [’red’,’black’]}SuperType.prototype.sayName = function (){ console.log(this.name)}function SubType(name, age){ SuperType.call(this, name) // 第二次調用SuperType this.age = age}SubType.prototype = new SuperType() // 第一次調用SuperTypeSubType.prototype.constructor = SubTypeSubType.prototype.sayAge = function (){ console.log(this.age)}

第一次調用SuperType構造函數時,SubType.prototype會得到兩個屬性:name和colors。他們都是SuperType的實例屬性,只不過現在位于SubType的原型中。當調用SubType構造函數時,又會調用一次SuperType構造函數,這個一次又在新對象上創建了實例屬性name和colors。于是,這兩個屬性就屏蔽了原型中的兩個同名屬性。即有兩組name和colors屬性:一組在實例上,一組在原型上。這就是調用兩次SuperType構造函數的結果。解決這個問題的方法就是————寄生組合式繼承。所謂寄生組合式繼承,即通過借用構造函數來繼承屬性,通過原型鏈的混成形式來繼承方法。其背后的基本思路是:不必為了制定子類型的原型而調用超類型的構造函數,我們所需要的無非就是超類型原型的一個副本而已。本質上,就是使用寄生式繼承來繼承超類型的原型,然后再將結果指定給子類型的原型。寄生組合式繼承的基本模式如下:

function object(o) { function F (){} F.prototype = o; return new F()}function inheritPtototype(subType, superType){ var prototype = object(superType.prototype) // 創建對象 prototype.constructor = subType // 增強對象 subType.prototype = prototype// 指定對象}function SuperType(name){ this.name = name this.colors = [’red’, ’white’]}SuperType.prototype.sayName = function(){ console.log(this.name)}function SubType(name,age){ SuperType.call(this,name) this.age = age}inheritPtototype(SubType, SuperType)SubType.prototype.sayAge = function(){ console.log(this.age)}var instance = new SubType(’ccc’, 18)instance.sayName() // --> cccinstance.sayAge() // --> 18console.log(instance)

控制臺打印出的結構:

js中實現繼承的五種方法

詳細的圖解:

js中實現繼承的五種方法

這個例子的高效率提現在它值調用了一次SuperType構造函數,并且因此避免了在SubType.prototype上面創建不必要的、多余的屬性。與此同時,原型鏈還能保持不變;因此,還能夠正常使用instanceof和isPrototypeOf()。這也是很多大廠用的繼承方式。

以上就是js中實現繼承的五種方法的詳細內容,更多關于js 實現繼承的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 国产液相色谱仪-超高效液相色谱仪厂家-上海伍丰科学仪器有限公司 | 北京网站建设首页,做网站选【优站网】,专注北京网站建设,北京网站推广,天津网站建设,天津网站推广,小程序,手机APP的开发。 | 安全阀_弹簧式安全阀_美标安全阀_工业冷冻安全阀厂家-中国·阿司米阀门有限公司 | 土壤检测仪器_行星式球磨仪_土壤团粒分析仪厂家_山东莱恩德智能科技有限公司 | 数码听觉统合训练系统-儿童感觉-早期言语评估与训练系统-北京鑫泰盛世科技发展有限公司 | 喷播机厂家_二手喷播机租赁_水泥浆洒布机-河南青山绿水机电设备有限公司 | 球磨机 选矿球磨机 棒磨机 浮选机 分级机 选矿设备厂家 | 阿米巴企业经营-阿米巴咨询管理-阿米巴企业培训-广东键锋企业管理咨询有限公司 | 蔡司三坐标-影像测量机-3D扫描仪-蔡司显微镜-扫描电镜-工业CT-ZEISS授权代理商三本工业测量 | 宝宝药浴-产后药浴-药浴加盟-艾裕-专注母婴调养泡浴 | 有机废气处理-rto焚烧炉-催化燃烧设备-VOC冷凝回收装置-三梯环境 | EPK超声波测厚仪,德国EPK测厚仪维修-上海树信仪器仪表有限公司 | 中高频感应加热设备|高频淬火设备|超音频感应加热电源|不锈钢管光亮退火机|真空管烤消设备 - 郑州蓝硕工业炉设备有限公司 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 污水/卧式/潜水/钻井/矿用/大型/小型/泥浆泵,价格,参数,型号,厂家 - 安平县鼎千泵业制造厂 | Maneurop/美优乐压缩机,活塞压缩机,型号规格,技术参数,尺寸图片,价格经销商 | 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 户外环保不锈钢垃圾桶_标识标牌制作_园林公园椅厂家_花箱定制-北京汇众环艺 | 门禁卡_智能IC卡_滴胶卡制作_硅胶腕带-卡立方rfid定制厂家 | 菲希尔X射线测厚仪-菲希尔库伦法测厚仪-无锡骏展仪器有限责任公司 | 北京森语科技有限公司-模型制作专家-展览展示-沙盘模型设计制作-多媒体模型软硬件开发-三维地理信息交互沙盘 | 捷码低代码平台 - 3D数字孪生_大数据可视化开发平台「免费体验」 | 船老大板材_浙江船老大全屋定制_船老大官网| 结晶点测定仪-润滑脂滴点测定仪-大连煜烁 | 洛阳防爆合格证办理-洛阳防爆认证机构-洛阳申请国家防爆合格证-洛阳本安防爆认证代办-洛阳沪南抚防爆电气技术服务有限公司 | 邢台人才网_邢台招聘网_邢台123招聘【智达人才网】 | 留学生辅导网-在线课程论文辅导-留学生挂科申诉机构 | 包头市鑫枫装饰有限公司| 中视电广_短视频拍摄_短视频推广_短视频代运营_宣传片拍摄_影视广告制作_中视电广 | 维泰克Veertek-锂电池微短路检测_锂电池腐蚀检测_锂电池漏液检测 | 哈尔滨京科脑康神经内科医院-哈尔滨治疗头痛医院-哈尔滨治疗癫痫康复医院 | 政府回应:200块在义乌小巷能买到爱情吗?——揭秘打工族省钱约会的生存智慧 | 瓶盖扭矩仪(扭力值检测)-百科 | 无线讲解器-导游讲解器-自助讲解器-分区讲解系统 品牌生产厂家[鹰米讲解-合肥市徽马信息科技有限公司] | 欧必特空气能-商用空气能热水工程,空气能热水器,超低温空气源热泵生产厂家-湖南欧必特空气能公司 | 厦门网站建设_厦门网站设计_小程序开发_网站制作公司【麦格科技】 | 山东彩钢板房,山东彩钢活动房,临沂彩钢房-临沂市贵通钢结构工程有限公司 | 陕西华春网络科技股份有限公司| 寮步纸箱厂_东莞纸箱厂 _东莞纸箱加工厂-东莞市寮步恒辉纸制品厂 | 聚丙烯酰胺PAM-聚合氯化铝PAC-絮凝剂-河南博旭环保科技有限公司 巨野电机维修-水泵维修-巨野县飞宇机电维修有限公司 | 众品家具网-家具品牌招商_家具代理加盟_家具门户的首选网络媒体。 |