JavaScript继承之老王的焦虑

525 阅读2分钟

下一篇 JavaScript继承之老王的绿帽反击战

话说有个人叫老王

let dad = {
    name: "老王",
    family:"王氏家族"
};

有一天他想生个儿子,可是老王他自己也生不出来,于是他跪了七天七夜求上天怜悯,玉皇大帝于心不忍便赐给他一台儿子制造机

function sonCreator(){}

玉皇大帝说,只要把这台机器注入你的血统,制造出来的就是你的儿子,老王听罢千恩万谢,随即将自己的血统注入机器

sonCreator.prototype = dad;

接下来老王就开始制造儿子了

let son = new sonCreator();

老王问儿子,你哪家的?

son.family; //王氏家族

老王又问你的名字是啥啊?

son.name; //老王

老王一看大吃一惊,怎么跟我名字一样,小王微微一笑回答道:“你没给我起名字啊,我只好通过制造机找到你的名字先用着了”。老王顿悟,原来是这样啊,我给你起个名字不就完了。

son.name = "小王";

起完名字,老王转头一想,为何不在制造儿子的时候就把名字起好呢?顺便把生日也记录一下,于是老王把儿子制造机一顿修改

function sonCreator() {
    this.name = "小王" + Math.random();
    this.time = new Date().getTime()
}

然后把儿子回炉重造了

son = new sonCreator();

这下老王很开心,又制造了几个儿子

s2 = new sonCreator();//{ name: '小王0.47669241584207844', time: 1624352962928 }
s3 = new sonCreator();//{ name: '小王0.12036476430215615', time: 1624352962928 }

这下老王有3个儿子了,大儿子son调了个皮,偷偷给老王扣了个绿帽子

son.__proto__.family = "八氏家族";
son.family; // "八氏家族";
s2.family;  // "八氏家族";
s3.family;  // "八氏家族";

老王很奇怪,儿子也改不了制造机的血统信息啊?这是咋回事呢,老王赶紧问玉帝,玉帝告诉他儿子的__proto__和儿子制造器的prototype是一样的,都指向了老王自己,不仅可以访问到老王,还可以给老王带绿帽子,这可如何是好?各位读者,如何才能让小王既完整的继承老王的血统,又没办法给老王戴绿帽子呢?