第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

大佬們遇到過這個問題嗎?es6繼承中super的指向問題

大佬們遇到過這個問題嗎?es6繼承中super的指向問題

慕運(yùn)維8079593 2019-09-08 22:06:23
問題描述在看阮一峰大神的ECMAScript6入門中有關(guān)繼承的部分的時候,有一個問題:前面提到super作為對象時,在普通方法中,指向父類的原型對象;在靜態(tài)方法中,指向父類那么下面的代碼classA{constructor(){this.x=1;}}classBextendsA{constructor(){super();this.x=2;super.x=3;console.log(super.x);//undefinedconsole.log(this.x);//3}}letb=newB();當(dāng)設(shè)置super.x=3時,我的理解相當(dāng)于是A.prototype.x=3但實(shí)際上好像這里的super就像this一樣,雖然文中提到ES6規(guī)定,在子類普通方法中通過super調(diào)用父類的方法時,方法內(nèi)部的this指向當(dāng)前的子類實(shí)例,但我認(rèn)為這里的super不是在調(diào)用父類的方法結(jié)果希望大神能幫我解釋一下這里super怎么回事,萬分感激
查看完整描述

2 回答

?
叮當(dāng)貓咪

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個贊

super.x=3;
這個賦值有點(diǎn)特殊。
super是A.prototype。對它的讀取來自A.prototype。但是,對它的賦值會進(jìn)入this里。這是向super.x賦值特殊的地方。
讀取的時候:console.log(super.x),會從A.prototype里讀,里面沒有x,于是輸出undefined。
==================
以下寫給想看一眼標(biāo)準(zhǔn)的:
val.x的形式會生成一個Reference,記錄了它是哪來的(base,這里是val),它叫什么(referencedname,這里是"x"),以及其它。
但是super.x會額外記錄一個信息,就是當(dāng)前的this(thisValue)。super.x的base是父類的prototype。
賦值的時候,會使用PutValue(V,W),其實(shí)V就是剛剛提到的super.x生成的Reference,W是要被賦進(jìn)去的值。然后它會執(zhí)行:
base.[[Set]](GetReferencedName(V),W,GetThisValue(V)).
GetReferencedName(V)與GetThisValue(V)分別取出了Refrence里記錄的refrencedname("x"),與thisValue(保存的this)。
它是給base的"x"屬性賦值W。但是多了一個thisValue是干嘛的呢...
我們來看真正執(zhí)行賦值的地方:OrdinarySetWithOwnDescriptor(O,P,V,Receiver,ownDesc)
這里O是上面的base(父類的prototype),P是屬性名("x"),V的要賦的值,Receiver就是thisValue
這個算法略長,拿出其中一步(這一步也不短...):
3.IfIsDataDescriptor(ownDesc)istrue,then
a.IfownDesc.[[Writable]]isfalse,returnfalse.
b.IfType(Receiver)isnotObject,returnfalse.
c.LetexistingDescriptorbe?Receiver.[[GetOwnProperty]](P).
d.IfexistingDescriptorisnotundefined,then
i.IfIsAccessorDescriptor(existingDescriptor)istrue,returnfalse.
ii.IfexistingDescriptor.[[Writable]]isfalse,returnfalse.
iii.LetvalueDescbethePropertyDescriptor{[[Value]]:V}.
iv.Return?Receiver.[[DefineOwnProperty]](P,valueDesc).
e.ElseReceiverdoesnotcurrentlyhaveapropertyP,
i.Return?CreateDataProperty(Receiver,P,V).
可以看到,所有的值,其實(shí)都寫進(jìn)了Receiver,也就被保存的this。
注:對普通的val.x,Reference沒有thisValue,GetThisValue直接返回base。這樣OrdinarySetWithOwnDescriptor中O與Receiver是同一個對象。
注2:讀的時候,如果不是getter,直接返回base里的屬性值。
注3:super.func()里的this,用的thisValue。val.func()的this,用的base(也就是val)
                            
查看完整回答
反對 回復(fù) 2019-09-08
?
白板的微信

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個贊

super()其實(shí)是相當(dāng)于newA()只執(zhí)行constructor產(chǎn)生的this用來構(gòu)建B實(shí)例super關(guān)鍵字===A.prototype
你可以這樣理解super與super()時的super不是一個東西
                            
查看完整回答
反對 回復(fù) 2019-09-08
  • 2 回答
  • 0 關(guān)注
  • 255 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號