很容易理解jsZ么这样做,因ؓ一个对象的行ؓ不能影响到其他对?否则会造成混ؕ.
理解上述规则之后让我们看看js中是如何通过原型对象实现l承?当我们创Z个对象时,可以把该对象看成是由2部分l成?一部分存储了该对象自己定义的属?UCؓA部分),而另一个部分则存储了其构造函数所定义的原型对象引?UCؓB部分),例如q里的BaseClass.prototype.当读取对象的属性时可以分ؓ以下2?
1.js先检查该对象引用所指向的内存区域的A部分是否存在该属?如果存在则读?
2.如果没有则再从B部分存储的引?BaseClass.prototype)所指向的内存区域中d该属?
从步?开始这是个不断往上寻扄q程,因ؓBaseClass.prototype所指向的内存区域也会分为A和B两个部分,如果再A部分也不存在该属?则又会从其B部分所指向的内存区域去L该属?而该内存区域也有A和B两个部分,如果A部分仍然不存?则还要从B部分所指向的内存区域去L该属?直到辑ֈ最层的Objectc?所以在无Ş当中Ş成了一条链,也就是我们常说的原型?如果理解了这个过E我想也p了解原型对象?下面单分析下b.constructor();的调用过E便于加q?
1.js会在b所指向的内存区域A部分dconstructor属?
2.当发现没有该属性后再从其类的构造函数原型对象引用所指向的内存区域读取该属?因ؓ原型对象引用初始时指向一Object对象内存区域(BaseClass.prototype = new Object();)
3.再从此Object对象的A部分Lconstructor属?
4.没有扑ֈ该属性则从其cȝ原型对象即Object.prototype中去Lconstructor.
5.如果扑ֈ该属性则调用.
6.否则,到达铄端,q回.
到此能很清楚的知道js中是如何实现l承?如果我们自定义的cM想承自Object,则可以修改其prototype的指?可以让其指向L一个类,q样也就实现了承自定义c?但js中所有的c都l承自Objectc?所以原型链的关pM然存?