复习一下原型链

JS是一门基于原型的语言,JS中的对象,无论是内置的Array、Date、Math、String还是用户自定义的亦或Function,都是对象且究其源基于Ocject。
当用构造函数创建一个对象时,对象的实例都有一个指向其原型的prototype,prototype又有一个constructor属性,这个construct属性故名思义(构造器)指向构造函数。
prototype--原型可以被添加属性和方法,添加之后,其所有的实例都可以共享prototype的属性和方法【这就产生了一个问题,静态的属性和方法当然没什么,但如果有的属性是引用类型,一旦被某个实例更新了,其他实例也将同步更新该引用类型,这就影响到别人了,后果很严重的,所以人们找到了解决办法,自定义对象的时候,静态属性方法由赋予prototype,引用类型的或实例自身私有的,属性赋予构造函数参数,方法在实例创建后定义,这就是传统流行的混合模式】
prototype还能被重写,即被赋予一个新的对象prototypeAnother。可是重写之后:
1.由重写之前的prototype所创建的那些实例,他们是不会共享到prototypeAnother的属性和方法的。
2.prototypeAnother所创建的的实例,也共享不到prototype原本的属性方法,因为prototype和prototypeAnother明确是两个独立的prototype。只是前后引用他们的对象一样而已。
-------------------------------------------------------------------------------------------------
创建对象的问题解决之后,由于一些更复杂的需求,人们需要基于原有的对象创建新的对象,这个新的对象除了有父对象的属性方法外,还要有自己的属性方法,以适应新的问题。(说白了就是面向对象编程中的继承)。但JS里面毕竟没有类的概念,只有对象。
那么,就模仿“类继承”吧。既然JS的实例对象都有个prototype指向其原型,那将父对象的实例赋予未来的子对象的prototype,就创建了一个以父对象的实例为原型的子对象:
So,子对象实例--prototypeTo->父对象实例--prototypeTo->父对象原型(也可能是某个祖对象实例)。
这就形成一个prototype链了。只要属性/方法名没有被覆盖,实例总能从其prototype中共享到搜寻到的第一个同名属性方法。
可是!如果子对象的prototype指向的父对象实例,包含引用类型的属性怎么办??没错,又是“prototype-引用类型”这个隐患!!有一种最常用的解决办法就是“构造函数调用”:在构造函数中,给正在构造的对象赋予属性时,我们都是用“this.XXX=XXX”句式来给当前对象赋予私有属性的。那么,在给子对象(子类)创建私有引用类型属性时,通过对父对象构造函数的引用,即FatherConstructor.call(this,xxx),可以安全的给子对象创建私有引用类型。
解决问题的方法很多,不要钻牛角尖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值