前言虽然JavaScript原型和原型链是一个老生常谈的话题,但还是让很多人感到困惑。今天我将从另一个角度来谈谈这个问题。让obj={}obj.__proto__.haha='gogo'console.log(obj.haha)//"gogo"运行上面的代码,输出是gogo。针对这个结果,我有以下疑问:obj的__proto__属性从何而来?为什么添加到__proto__中的属性可以直接通过obj获取?第一个问题js中每个对象都有一个“原型”,原型一般可以通过__proto__来访问:,hasOwnProperty:?,__lookupGetter__:?,...}可以这样理解:原型也是一个对象。就像:每个“人”都有一个“父亲”;但“父亲”也是一个“人”;“父亲”除了是某人的父亲外,与其他人并无本质区别;父亲也是一个普通人。同样:“原型”是一个普通对象;爸爸有他的爸爸,原型有它的原型。第二个问题是物与人不同:人不能只从父亲那里拿东西,而物却可以从原型那里拿东西。例如,当你向一个对象要一个属性时:如果这个对象没有你想要的属性,它会给你它的原型(爸爸)如果它没有父亲,那么它的父亲会找到它父亲的父亲.比如下面这个例子:letobj={__proto__:{__proto__:{haha??:'gogo'}}}console.log(obj.haha)//"gogo"因为obj本身没有属性哈哈,所以它会在自己的__proto__中查找,如果没有找到,就会去自己的__proto__.__proto__中查找,直到找到haha属性或者__proto__链返回null。另一种写法:letgrandpa={haha??:'gogo'}letdaddy={__proto__:grandpa}letobj={__proto__:daddy}console.log(obj.haha)//"gogo"是寻找对象的过程哈哈attribute是:obj->爸爸->爷爷,是不是像个链条?这就是原型链。关于原型有一句话:类是对象的模板。你我都是人,“人”就是类和模板。你我都属于“人”的范畴,有很多共同点:一张嘴,两条腿,吃饭睡觉……这些共同点是人类共有的。当然,你我作为独立的对象,肯定是有区别的,比如:我叫X,你叫Y,这些区别就是对象“私有”。看一段js中创建对象的代码(注意注释部分):functionPerson(name){this.name=name}Person.prototype。eat=function(){console.log('eateat')}Person.prototype.sleep=function(){console.log('sleepsleep')}letme=newPerson('me')me.eat()//“吃吃”console.log(Person.prototype===me.__proto__)//true//可见在实例化过程中,类的原型变成了对象的原型letyou=newPerson('you')you.sleep()//"sleepsleep"console.log(I.__proto__===you.__proto__)//true//同一个类的多个实例(对象),共享一个原型?I.__proto__.eat=function(){console.log('再吃一点')}console.log(me.eat==you.eat)//trueyou.eat()//"再吃一点》//对,同一个类的多个实例,共享一个原型,类比人类社会,即:你的兄弟姐妹与你“共享”一个父亲。在这个过程中,同时烫头的不是两个爸爸,而是一个爸爸。重要结论:在实例化过程中(即“新建一个对象时”),类的原型成为对象的原型同一个类(即“对象”)的多个实例共享一个原型结论prototype是js底层的东西,看不懂prototype,几乎不影响工作。诸如“原型有什么用”之类的问题就像“砖(或水泥)用于建造建筑物有什么用”。其实在写代码的过程中,原型的知识几乎用不到。但是如果遇到问题,bug,或者性能优化,底层的知识肯定会有大用。~~本文到此结束,感谢阅读!~学习有趣的知识,认识有趣的朋友,塑造有趣的灵魂!大家好,我是〖编程三昧〗的作者王隐,我的公众号是《编程三昧》,欢迎关注,希望大家多多指教!
