首先我們來(lái)看一道題:
class A {
say() {
console.log('foo')
}
}
let a = new A()
A.prototype = {
say() {
console.log('bar')
}
}
a.say()
乍看這道題,也許你會(huì)有點(diǎn)萌萌噠视乐,這題想干錘子洛搀?
沒(méi)事我們來(lái)簡(jiǎn)化一下:
function A(){}
let a = new A()
A.prototype = {
say() {
console.log('bar')
}
}
a.say()
好的,來(lái)分析一下這個(gè)佑淀。
let a = new A()
語(yǔ)句執(zhí)行之后留美,a.__proto__
已經(jīng)指向了A.prototype
,在這條語(yǔ)句之后重寫(xiě)A.prototype
伸刃,并不會(huì)影響a.__proto__
的指向谎砾,因此 報(bào)錯(cuò)。如果把let a = new A()
放在A.prototype = {...}
之后捧颅,a.__proto__
會(huì)指向重定義后的A.prototype
景图,這樣的話會(huì)輸出bar
。
回到題目碉哑,根據(jù)以上的分析挚币,會(huì)輸出foo
,如果把let a = new A()
放在A.prototype = {...}
之后扣典,會(huì)輸出bar
妆毕。等等,真的跟你想的一樣會(huì)輸出bar
激捏?
小伙子设塔,sometime is naive啊远舅!
為啥不輸出bar
闰蛔?我們進(jìn)一步探討
可以看到,我的js引擎對(duì)class A的prototype的定義中图柏,writable:false序六。也就是class的prototype是不可重寫(xiě)的!
但是蚤吹!有的小伙伴的chrome中:
例诀。随抠。。繁涂。
writable:true
拱她!
好了,結(jié)論出來(lái)了扔罪。這題雖然想考的是實(shí)力對(duì)象的__proto__
的指向秉沼,但是他沒(méi)注意到不同版本的chrome對(duì)class的prototype定義不一樣。正常情況應(yīng)該是不可重寫(xiě)的矿酵。