摘要:繼承原型鏈如果構(gòu)造函數(shù)或?qū)ο蟮脑椭赶驑?gòu)造函數(shù)或?qū)ο螅脑驮僦赶驑?gòu)造函數(shù)或?qū)ο螅源祟愅疲罱K的構(gòu)造函數(shù)或?qū)ο蟮脑椭赶虻脑汀?/p>
繼承 原型鏈
如果構(gòu)造函數(shù)或?qū)ο驛的原型指向構(gòu)造函數(shù)或?qū)ο驜,B的原型再指向構(gòu)造函數(shù)或?qū)ο驝,以此類推,最終的構(gòu)造函數(shù)或?qū)ο蟮脑椭赶騉bject的原型。由此形成了一條鏈狀結(jié)構(gòu),被稱之為原型鏈。按照上述的描述,在B中定義的屬性或方法,可以在A中使用并不需要定義。這就是繼承,它允許每個對象來訪問其原型鏈上的任何屬性或方法。在JS語言中,原型鏈?zhǔn)抢^承的默認(rèn)產(chǎn)生方式。
//原型鏈 function A(){ this.a = "a"; } //通過構(gòu)造函數(shù)創(chuàng)建對象 var a = new A(); function B(){ this.b = "b"; } //將B的原型指向A B.prototype = a ; var b =new B(); console .log(b.a);//a console .log(b.b);//b function C(){ this.c = "c" } //將C的原型指向B C.prototype = b; var c= new C(); /*console .log(對象.屬性)*/ console .log(c.c);//c console .log(c.b);//b console .log(c.a);//a只繼承與原型
出于對效率的考慮,盡可能地將屬性和方法加到原型上,可以采用以下方式:
1.不要為繼承關(guān)系多帶帶創(chuàng)建新對象。
2.盡量減少運(yùn)行時的方法搜索。
//原型鏈 function A(){ } A.prototype.a="a";//將自有屬性改寫為原型屬性 function B(){ } B.prototype=A.prototype; //將B的原型屬性指向A的原型屬性 B.prototype.b = "b"; function C(){ this .c="c"; } C.prototype = B.prototype; var c = new C; console .log(c.c); console .log(c.b); console .log(c.a);原型鏈的問題
原型鏈雖然強(qiáng)大,用它可以實(shí)現(xiàn)JS中的繼承,但同時也存在一些問題。
1.原型鏈實(shí)際上是在多個構(gòu)造函數(shù)或?qū)ο笾g共享屬性和方法。
2.創(chuàng)建子類的對象時,不能向父級的構(gòu)造函數(shù)傳遞任何參數(shù)。
所以,在實(shí)際開發(fā)中,很少會多帶帶使用原型鏈。
所謂原型式繼承,就是定義一個函數(shù),該函數(shù)中創(chuàng)建一個歷史性的構(gòu)造函數(shù),將作為參數(shù)傳入的對象作為這個構(gòu)造函數(shù)的原型,最后返回這個構(gòu)造函數(shù)的實(shí)現(xiàn)對象。
/* 定義一個函數(shù) - 用于實(shí)現(xiàn)對象之間的繼承 * 參數(shù) * obj - 表示繼承關(guān)系中的父級對象 * prop - 對象格式,表示繼承關(guān)系中的子級對象的屬性和方法 */ function fn(obj, porp){ // 定義一個臨時的構(gòu)造函數(shù) function Fun(){ // 遍歷對象的屬性和方法 for (var attrName in porp) { // var attrValue = porp[attrName]; this[attrName] = porp[attrName]; } } // 將函數(shù)的參數(shù)作為構(gòu)造函數(shù)的原型 Fun.prototype = obj; // 將構(gòu)造函數(shù)創(chuàng)建的對象進(jìn)行返回 return new Fun(); } var obj = { name : "HK" } // 調(diào)用函數(shù) var result = fn(obj, { age : 26, sayMe : function(){ console.log("this is function"); } }); console.log(result.age); result.sayMe();Object.create()方法實(shí)現(xiàn)繼承
var obj = { name : "HK" } var newObj = Object.create(obj, { age : { value : 26 }, sayMe : { value : function(){ console.log("this is function"); } } }); console.log(newObj.age); newObj.sayMe();借助構(gòu)造函數(shù)
在子級中調(diào)用父級元素的屬性
// 定義父級對象的構(gòu)造函數(shù) function Parent(){ this.parent = "parent"; } // 定義子級對象的構(gòu)造函數(shù) function Child(){ // 調(diào)用父級對象的構(gòu)造函數(shù) -> 使用apply()或call()方法 Parent.call(this); this.child = "child"; } // 創(chuàng)建子級對象 var child = new Child(); console.log(child);
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/108405.html
摘要:網(wǎng)上有很多前端的學(xué)習(xí)路徑文章,大多是知識點(diǎn)羅列為主或是資料的匯總,數(shù)據(jù)量讓新人望而卻步。天了解一個前端框架。也可以關(guān)注微信公眾號曉舟報告,發(fā)送獲取資料,就能收到下載密碼,網(wǎng)盤地址在最下方,獲取教程和案例的資料。 前言 好的學(xué)習(xí)方法可以事半功倍,好的學(xué)習(xí)路徑可以指明前進(jìn)方向。這篇文章不僅要寫學(xué)習(xí)路徑,還要寫學(xué)習(xí)方法,還要發(fā)資料,干貨滿滿,準(zhǔn)備接招。 網(wǎng)上有很多前端的學(xué)習(xí)路徑文章,大多是知...
摘要:只有滿足才返回,否則返回。專門用于篩選出數(shù)組中符合函數(shù)判斷條件的元素組成的心數(shù)組。專門用于對原數(shù)組中每個元素執(zhí)行相同的函數(shù)對象規(guī)定的操作。并歸方法將數(shù)組從左向右迭代。 Array類型 數(shù)組的常見方法 檢測數(shù)組 如何確定當(dāng)前是一個數(shù)組,JS提供了以下幾種方式1.typeof無法檢測數(shù)組對象:typrof[]返回object2.instanceof:[]instanceof Array返回...
摘要:基本概念行高行距行高是指文本行基線間的垂直距離。行框行框是指本行的一個虛擬的矩形框,由該行中行內(nèi)框組成。行框也是瀏覽器渲染模式中的一個概念,無法顯示出來。行框高度等于本行中所有行內(nèi)框高度的最大值。設(shè)置合理的行間距。設(shè)置固定的行間距。 又已經(jīng)快十天沒有寫文章了,一周一篇其實(shí)好艱難的說……本來想接著上篇事件(上篇)總結(jié)事件類型的,可是看完之后整理下還是有點(diǎn)亂,就一直拖著沒寫……實(shí)在是不能再...
摘要:運(yùn)行機(jī)制表數(shù)據(jù)入口包含了用于訪問單個表或試圖的所有,如選擇插入更新刪除等。其他代碼調(diào)用它的方法來實(shí)現(xiàn)所有與數(shù)據(jù)庫的交互。示例如下圖分別是普通情況下充分利用特征下的表數(shù)據(jù)入口實(shí)現(xiàn)行數(shù)據(jù)入口充當(dāng)數(shù)據(jù)源中單條記錄入口的對象,每行一個實(shí)例。 1. 表數(shù)據(jù)入口 充當(dāng)數(shù)據(jù)庫表訪問入口的對象,一個實(shí)例處理表中所有的行。 1)運(yùn)行機(jī)制: 表數(shù)據(jù)入口包含了用于訪問單個表或試圖的所有SQL,如...
閱讀 803·2021-09-22 16:01
閱讀 2095·2021-08-20 09:37
閱讀 1700·2019-08-30 15:54
閱讀 1698·2019-08-30 15:44
閱讀 842·2019-08-28 18:23
閱讀 3021·2019-08-26 12:17
閱讀 1022·2019-08-26 11:56
閱讀 1545·2019-08-23 16:20