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,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。注:對普通的val.x,Reference沒有thisValue,GetThisValue直接返回base。這樣OrdinarySetWithOwnDescriptor中O與Receiver是同一個對象。注2:讀的時候,如果不是getter,直接返回base里的屬性值。注3:super.func()里的this,用的thisValue。val.func()的this,用的base(也就是val)