美文网首页程序员
【js】涨知识系列,关于class的prototype!

【js】涨知识系列,关于class的prototype!

作者: 陈小俊先生 | 来源:发表于2017-07-27 13:15 被阅读0次

首先我们来看一道题:

class A {
    say() {
        console.log('foo')
    }
}

let a = new A()

A.prototype = {
    say() {
        console.log('bar')
    }
}

a.say()

乍看这道题,也许你会有点萌萌哒,这题想干锤子?

没事我们来简化一下:

function A(){}

let a = new A()

A.prototype = {
    say() {
        console.log('bar')
    }
}

a.say()

好的,来分析一下这个。

let a = new A()语句执行之后,a.__proto__已经指向了A.prototype,在这条语句之后重写A.prototype,并不会影响a.__proto__的指向,因此 报错。如果把let a = new A()放在A.prototype = {...}之后,a.__proto__会指向重定义后的A.prototype,这样的话会输出bar

回到题目,根据以上的分析,会输出foo,如果把let a = new A()放在A.prototype = {...}之后,会输出bar。等等,真的跟你想的一样会输出bar

image.png

小伙子,sometime is naive啊!

为啥不输出bar?我们进一步探讨

image.png

可以看到,我的js引擎对class A的prototype的定义中,writable:false。也就是class的prototype是不可重写的!

但是!有的小伙伴的chrome中:

image.png

。。。。

image.png

writable:true

好了,结论出来了。这题虽然想考的是实力对象的__proto__的指向,但是他没注意到不同版本的chrome对class的prototype定义不一样。正常情况应该是不可重写的。

ps:如果你面试的时候碰到这道题,记得怼死面试官。。

如果你是面试官,那你可就得注意了。。

相关文章

网友评论

    本文标题:【js】涨知识系列,关于class的prototype!

    本文链接:https://www.haomeiwen.com/subject/owdzkxtx.html