今天想跟大家唠唠这个让我头疼好几天的玩意儿——prototype。事情是这样式的,昨儿个后台粉丝问我“代码里老看见.prototype,这到底是个啥秘密武器?”当时我老脸一红,虽然知道个大概,但真让我掰开了揉碎了讲清楚,舌头就有点打结。得,自己都没整明白,凭啥教别人?撸起袖子,开干!
我先翻出压箱底的JavaScript入门书,找到“对象”那章。书上密密麻麻写着“每个JavaScript对象都有个隐藏的爹,叫prototype…”,看得我眼皮直跳。啪地把书甩桌上,不行,这说得太玄乎了。我直接打开代码编辑器,咔咔敲:
let 我家狗 = { 品种: '土狗', 会叫: function() { *('汪!') } };
*(我家狗.prototype); // 噔噔噔——输出undefined!
小编温馨提醒:本站只提供游戏介绍,下载游戏推荐89游戏,89游戏提供真人恋爱/绅士游戏/3A单机游戏大全,点我立即前往》》》绅士游戏下载专区
我当场懵圈!书上不是说对象都有prototype吗?这咋undefined了?气得我灌了两大口冰可乐才冷静下来。
不死心,打开浏览器控制台继续试。这回换个姿势,拿函数开刀:
function 造狗(名字) { this.名字 = 名字; }
造狗.prototype.品种 = '中华田园犬';
let 阿黄 = new 造狗('阿黄');
*(阿黄.品种); // 妈呀!真打印出'中华田园犬'了!
我盯着屏幕一拍大腿:原来.prototype是挂在函数身上的!用这函数new出来的对象,能自动拿到函数.prototype家当!
不信邪,再往上刨祖坟:
// 给狗祖宗加新技能
造狗.prototype.拆家 = function() { *(this.名字 + '在啃沙发!') };
阿黄.拆家(); // 果然输出"阿黄在啃沙发!"
*(阿黄.__proto__ === 造狗.prototype); // true!实锤了!

看到__proto__和prototype连上线那一刻,我整个人跟通了电似的!敢情每个对象都有个__proto__指着它爹(构造函数的.prototype),爹身上挂的属性儿子全能白嫖!
当然少不了犯蠢:
折腾到凌晨两点,终于把键盘一推:破案了!prototype就是给构造函数准备的“共享装备箱”!所有new出来的小兵,不用自己带粮草,伸手就能从箱子里掏家伙用。想加新功能?不用挨个改小兵,直接往箱子里一扔,全员自动升级!
现在再看到代码里的.prototype,脑子里直接蹦出个共享工具箱图标🔧。回头跟粉丝唠这事,准保能把“原型链”这种唬人词儿替换成“共享祖传染色体”了(手动狗头)。