JavaScript之原型链(二)

JavaScript使对象实例在内部持有这样一个__proto__属性,并且不允许用户访问。这样,用户可以出于任何目的来修改constructor属性,而不用担心实例与父类的一致性。——《JavaScript语言精粹与编程实践》

一、内部原型链

上一篇一步一步地看到了通过prototype属性和constructor属性如何形成JavaScript原型链。其实在这个原型链之外,正如本篇最开始引用的文字所描述的那样,因为prototype属性和constructor属性可以任意赋值,为了维系父类与实例之间的继承关系,JavaScript内部还有一个通过__proto__属性形成的内部原型链来保持各个对象之间的继承关系。

再贴一遍上篇中写的代码:

var Language = function (name) {
    this.name = name;
};

Language.prototype.a ='aaa';

var lan1 = new Language('JavaScript');

考虑到每个对象的__proto__属性,上述代码在内部环境中的构成如下图所示:

图示1

图中虚线部分即内部原型链。以下是对上面图示的验证:

图示2

二、JavaScript原型链小结

最后加入了内部原型链的链图看上去有点“错综复杂”,一时看明白之后过个十天半月恐怕又会忘记。为了便于日后回忆,下面再对链图的特点做如下小结:

  1. 查找对象的某个属性的过程,就是遍历对象的原型链直到原型为空(null)或找到该属性的过程。
  2. 所有的对象最终都会引用(继承于)一个指向null的Object()构造器的实例。
  3. 函数也是一种对象,它继承于系统内置的Function()构造器的实例;函数的原型是系统内置的Object()构造器的实例。
  4. 构造器的原型的constructor属性总是指向构造器本身。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值