super.x=3;這個(gè)賦值有點(diǎn)特殊。super是A.prototype。對(duì)它的讀取來自A.prototype。但是,對(duì)它的賦值會(huì)進(jìn)入this里。這是向super.x賦值特殊的地方。讀取的時(shí)候:console.log(super.x),會(huì)從A.prototype里讀,里面沒有x,于是輸出undefined。==================以下寫給想看一眼標(biāo)準(zhǔn)的:val.x的形式會(huì)生成一個(gè)Reference,記錄了它是哪來的(base,這里是val),它叫什么(referencedname,這里是"x"),以及其它。但是super.x會(huì)額外記錄一個(gè)信息,就是當(dāng)前的this(thisValue)。super.x的base是父類的prototype。賦值的時(shí)候,會(huì)使用PutValue(V,W),其實(shí)V就是剛剛提到的super.x生成的Reference,W是要被賦進(jìn)去的值。然后它會(huì)執(zhí)行:base.[[Set]](GetReferencedName(V),W,GetThisValue(V)).GetReferencedName(V)與GetThisValue(V)分別取出了Refrence里記錄的refrencedname("x"),與thisValue(保存的this)。它是給base的"x"屬性賦值W。但是多了一個(gè)thisValue是干嘛的呢...我們來看真正執(zhí)行賦值的地方:OrdinarySetWithOwnDescriptor(O,P,V,Receiver,ownDesc)這里O是上面的base(父類的prototype),P是屬性名("x"),V的要賦的值,Receiver就是thisValue這個(gè)算法略長,拿出其中一步(這一步也不短...):3.IfIsDataDescriptor(ownDesc)istrue,thena.IfownDesc.[[Writable]]isfalse,returnfalse.b.IfType(Receiver)isnotObject,returnfalse.c.LetexistingDescriptorbe?Receiver.[[GetOwnProperty]](P).d.IfexistingDescriptorisnotundefined,theni.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。注:對(duì)普通的val.x,Reference沒有thisValue,GetThisValue直接返回base。這樣OrdinarySetWithOwnDescriptor中O與Receiver是同一個(gè)對(duì)象。注2:讀的時(shí)候,如果不是getter,直接返回base里的屬性值。注3:super.func()里的this,用的thisValue。val.func()的this,用的base(也就是val)