segmentfault官方|深入挖掘原型链( 二 )


segmentfault官方|深入挖掘原型链
本文插图

原型链图示
这就是一条完整的原型链了 , 从图中我们可以发现:
Object.prototype是原型链的尽头 , 再向上就是null了 , null是无意义的 , 一次所有的对象都继承了Object.prototype上的属性和方法 。
4.提一个小问题 , 我想让Foo的所有实例对象都具有数组的属性和方法 , 应该怎么做呢?
通过上面的分析 , 我们知道 , 实例对象共用的属性和方法都应该定义在了他们的原型对象上 , 所以数组的属性和方法都在Array.prototype上 ,
实例对象f1,f2共用的属性和方法来自Foo.prototype,所以我们可以:
Foo.prototype=Array.prototype
这样f1,f2就继承了数组的属性和方法 , 但是我们需要注意一点 , 此时输出f1.constructor , 来观察f1 , f2的构造函数会发现它们已经成了Array ,
这是因为constructor属性同样是从原型对象Foo.prototype上继承而来的 , 所以当Foo.prototype上的constructor属性发生变化时 , 实例对象f1的constructor也会变化 。 所以我们如果不想让构造函数发生变化的话 , 需要重写一次Foo.prototype的constructor属性 ,
Foo.prototype=Array.prototype
Foo.prototype.constructor=Foo 。
所以我们需要注意 , 在修改实例对象的原型对象之后 , 也要记得修改constructor属性
SegmentFault 思否社区和文章作者展开更多互动和交流 。


推荐阅读