亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

es6繼承中super的指向問題萬分感謝

es6繼承中super的指向問題萬分感謝

一只名叫tom的貓 2019-10-18 09:14:22
問題描述在看阮一峰大神的ECMAScript6入門中有關繼承的部分的時候,有一個問題:前面提到super作為對象時,在普通方法中,指向父類的原型對象;在靜態方法中,指向父類那么下面的代碼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();當設置super.x=3時,我的理解相當于是A.prototype.x=3但實際上好像這里的super就像this一樣,雖然文中提到ES6規定,在子類普通方法中通過super調用父類的方法時,方法內部的this指向當前的子類實例,但我認為這里的super不是在調用父類的方法結果希望大神能幫我解釋一下這里super怎么回事,萬分感激
查看完整描述

2 回答

?
MYYA

TA貢獻1868條經驗 獲得超4個贊

super.x=3;
這個賦值有點特殊。
super是A.prototype。對它的讀取來自A.prototype。但是,對它的賦值會進入this里。這是向super.x賦值特殊的地方。
讀取的時候:console.log(super.x),會從A.prototype里讀,里面沒有x,于是輸出undefined。
==================
以下寫給想看一眼標準的:
val.x的形式會生成一個Reference,記錄了它是哪來的(base,這里是val),它叫什么(referencedname,這里是"x"),以及其它。
但是super.x會額外記錄一個信息,就是當前的this(thisValue)。super.x的base是父類的prototype。
賦值的時候,會使用PutValue(V,W),其實V就是剛剛提到的super.x生成的Reference,W是要被賦進去的值。然后它會執行:
base.[[Set]](GetReferencedName(V),W,GetThisValue(V)).
GetReferencedName(V)與GetThisValue(V)分別取出了Refrence里記錄的refrencedname("x"),與thisValue(保存的this)。
它是給base的"x"屬性賦值W。但是多了一個thisValue是干嘛的呢...
我們來看真正執行賦值的地方: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).
可以看到,所有的值,其實都寫進了Receiver,也就被保存的this。
注:對普通的val.x,Reference沒有thisValue,GetThisValue直接返回base。這樣OrdinarySetWithOwnDescriptor中O與Receiver是同一個對象。
注2:讀的時候,如果不是getter,直接返回base里的屬性值。
注3:super.func()里的this,用的thisValue。val.func()的this,用的base(也就是val)
                            
查看完整回答
反對 回復 2019-10-18
?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

super()其實是相當于newA()只執行constructor產生的this用來構建B實例super關鍵字===A.prototype
你可以這樣理解super與super()時的super不是一個東西
                            
查看完整回答
反對 回復 2019-10-18
  • 2 回答
  • 0 關注
  • 465 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號