js原型鏈

@轉(zhuǎn)載說(shuō)明出處犬绒。
打算寫一個(gè)專題,專門詳細(xì)的介紹node.js的方方面面盒犹,已經(jīng)用node.js兩年了懂更,算是一個(gè)總結(jié).

先說(shuō)結(jié)論:
js里對(duì)象會(huì)從原型鏈上繼承所有的方法和屬性。 會(huì)從es6類上繼承所有的私有屬性急膀。會(huì)從uitl.inherits上只繼承當(dāng)前類的私有屬性.

先上代碼吧

var A = function(){

    this.name = 'aaaaaaaaaaaaaa';

}

var B = function(){

    this.name = 'bbbbbbbbbbbb';

}

var C = function(){

    this.name = 'cccccccccccc';

}

const util = require('util');

util.inherits(B, A);

util.inherits(C, B)

var c = new C();

console.info('------------function test----------------');

console.info(C.super_ === B);

console.info(B.super_ === A);

console.info(A.__proto__ === Function.prototype && Function.prototype === Function.__proto__ );

console.info(B.__proto__ === Function.prototype );

console.info(B.__proto__ === A.__proto__ );

console.info(Object.prototype.__proto__);

console.info(c.__proto__.__proto__.__proto__.__proto__ === Object.prototype);

下面幾句話很重要晨雳,算是對(duì)上面代碼的一個(gè)總結(jié)
1.Function.prototype是一切之母,它來(lái)產(chǎn)生函數(shù)氧吐,類。也可以說(shuō)任何類版仔,函數(shù)都是它生成的蝉揍。
這句話就代表了所有的函數(shù)的 proto 都等于 Funtion.prototype
2. js的對(duì)象產(chǎn)生是原型產(chǎn)生的熙卡,這跟其他語(yǔ)言是不一樣的滑燃,其他語(yǔ)言new C甜滨,那么就是C產(chǎn)生的艾扮,而js的對(duì)象是C的原型類型即C.prototype產(chǎn)生的。js的對(duì)象會(huì)去拿取原型鏈中的公共方法和屬性纹腌,再去類或函數(shù)中拿取私有屬性和函數(shù)
c.proto = C.prototype(C的原型);
c.proto.proto = B.prototype(B的原型);
c.proto.proto.proto = A.prototype(A的原型)击困,
c.proto.proto.proto.proto = Object.prototype(Object的原型)
c.proto.proto.proto.proto.proto = null;
**3. 類的繼承谅海,用utils.inherits繼承是 C.super_ = B; B.super_ = C; C.proto = Funciton.prototype侥袜; Function.proto = Function.prototype;
如果用es6的class繼承, 那就沒有super
, C.proto = B; B.proto = C; C.proto = Function.prototype, Function.proto = Function.prototype;
總的來(lái)說(shuō),對(duì)象和類的繼承走的不是一條路線,類的繼承,爸爸是Function.prototype.人家Function有這個(gè)能力構(gòu)建函數(shù)。
對(duì)象的繼承毅哗,走的Object這條原型鏈翅睛。會(huì)把所有的原型鏈上的公共方法和屬性都帶給 對(duì)象. 對(duì)私有屬性扎酷,
用util.inherits繼承的話: 私有屬性只是當(dāng)前類的坷剧。比如對(duì)象c狞尔,只會(huì)拿去C的私有屬性研儒。
用ES6的class 繼承的話冲呢。A,B,C所有類的私有屬性都會(huì)拿過來(lái)。




var A = function(){
    this.name = 'aaaaaaaaaaaaaa';
    this.priA = "priA";
}
A.prototype.protoPriA = "protoPriA";
var B = function(){
    this.name = 'bbbbbbbbbbbb';
    this.priB = "priB";
}
var C = function(){
    this.name = 'cccccccccccc';
    this.priC = "priC";
}

const util = require('util');

util.inherits(B, A);
util.inherits(C, B)


var c = new C();
console.info(c.priC);
console.info(c.priB);
console.info(c.priA);
console.info(c.protoPriA);

console.info('------------function test----------------');

console.info(C.super_ === B);
console.info(B.super_ === A);
console.info(A.__proto__ === Function.prototype && Function.prototype === Function.__proto__ );

console.info(B.__proto__ === Function.prototype );
console.info(B.__proto__ === A.__proto__ );

A.prototype.sayA = function () {
    console.info("i am sayA........");    
}


//Function.prototype是一切之母,產(chǎn)生類,

console.info(Object.prototype.__proto__);
console.info(c.__proto__.__proto__.__proto__.__proto__ === Object.prototype);

c.sayA();


class CA {
    constructor() {
        this.name = 'ca';
        this.priCA = 'priCA';
    }
    
    CATest(){
        console.info("i am ca\n");
    }
}
class CB extends CA {
    constructor() {
        super();
        this.name = 'CB';
        this.priCB = 'priCB';
    }
    
    CBTest(){
        console.info("i am CB\n");
    }
}
class CC extends CB {
    constructor() {
        super();
        this.name = 'CC';
        this.priCC = 'priCC';
    }
    
    CCTest(){
        console.info("i am CC\n");
    }
}

console.info('-----------------class test------------------');
var cc = new CC();

console.info(cc.priCA);
console.info(cc.priCB);
cc.CATest();

console.info(CC.__proto__ === CB);
console.info(CB.__proto__ === CA);
console.info(CA.__proto__ === Function.prototype && Function.prototype === Function.__proto__);

console.info(CB.__proto__ === Function.prototype);  //false
console.info(CB.__proto__ === CA.__proto__); //false

//Function.prototype是一切之母进鸠,產(chǎn)生類,

console.info(Object.prototype.__proto__);
console.info(cc.__proto__.__proto__.__proto__.__proto__ === Object.prototype);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末量瓜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖倘屹,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異寸宵,居然都是意外死亡赶掖,警方通過查閱死者的電腦和手機(jī)感猛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奢赂,“玉大人陪白,你說(shuō)我怎么就攤上這事∩旁睿” “怎么了咱士?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)袖瞻。 經(jīng)常有香客問我司致,道長(zhǎng),這世上最難降的妖魔是什么聋迎? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任脂矫,我火速辦了婚禮,結(jié)果婚禮上霉晕,老公的妹妹穿的比我還像新娘庭再。我一直安慰自己,他們只是感情好牺堰,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布拄轻。 她就那樣靜靜地躺著,像睡著了一般伟葫。 火紅的嫁衣襯著肌膚如雪恨搓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音斧抱,去河邊找鬼常拓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛辉浦,可吹牛的內(nèi)容都是我干的弄抬。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼宪郊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼掂恕!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起弛槐,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤懊亡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后乎串,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斋配,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年灌闺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坏瞄。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡桂对,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸠匀,到底是詐尸還是另有隱情蕉斜,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布缀棍,位于F島的核電站宅此,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏爬范。R本人自食惡果不足惜父腕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望青瀑。 院中可真熱鬧璧亮,春花似錦、人聲如沸斥难。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哑诊。三九已至群扶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背竞阐。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工缴饭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人馁菜。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓茴扁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親汪疮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子峭火,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容