Open jerryni opened 3 years ago
前面介绍过了js原型的发展史,下面说的是js里的原型链:
官方是这么描述的:
这段话还是有点难理解的,我们直接从代码的角度对这些话进行拆分,然后尝试理解一下:
// 构造函数 function Person() {} // 每个构造函数都有一个原型对象 console.log(typeof Person.prototype); // "object" // 原型对象都包含一个指向构造函数的指针 Person.prototype.constructor === Person; //true var p1 = new Person(); // 实例都包含一个指向原型对象的指针(浏览器为了方便调试将对象的__proto__的私有指针暴露了出来) p1.__proto__ === Person.prototype; // true
假如我们让原型对象等于另一个类型的实例(这句话其实就是继承的实现方法):
// 让Women继承Person function Women() {} Women.prototype = new Person(); // 此时原型对象将包含另一个原型对象的指针 Women.prototype.__proto__ === Person.prototype // true;
那么, Object和Person又是什么关系呢?
// 由于Person的原型是没有指向另一个类型的实例的, 所以猜想默认应该是指向了Object的实例 Person.prototype.__proto__ === Object.prototype; //true, 猜想是正确的!!!
综上所述, 便形成了一条 Women => Person => Object的实例与原型的链条,就是原型链啦!
这时候再回去读一下书上那段话,看你理解了没有~
从上图中可知以下几点:
自定义函数(Foo)和内置Object, Function的关系:
Foo.__proto__ === Function.prototype
Foo.prototype.__proto__ === Object.prototype
自定义对象(obj)和Object的关系:
obj.__proto__ === Object.prototype
内置Function和Object的关系:
Object.__proto__ === Function.prototype
Function.prototype.__proto__ === Object.prototype
原型链的终点是null:
Object.prototype.__proto__ === null;
javascript高级程序设计(第三版) JavaScript权威指南(第六版)
winter的原型链深究: http://www.cnblogs.com/winter-cn/archive/2009/05/16/1458390.html
前面介绍过了js原型的发展史,下面说的是js里的原型链:
官方是这么描述的:
这段话还是有点难理解的,我们直接从代码的角度对这些话进行拆分,然后尝试理解一下:
假如我们让原型对象等于另一个类型的实例(这句话其实就是继承的实现方法):
那么, Object和Person又是什么关系呢?
综上所述, 便形成了一条 Women => Person => Object的实例与原型的链条,就是原型链啦!
话外的原型链
从上图中可知以下几点:
自定义函数(Foo)和内置Object, Function的关系:
Foo.__proto__ === Function.prototype
Foo.prototype.__proto__ === Object.prototype
自定义对象(obj)和Object的关系:
obj.__proto__ === Object.prototype
内置Function和Object的关系:
Object.__proto__ === Function.prototype
Function.prototype.__proto__ === Object.prototype
原型链的终点是null:
参考资料
javascript高级程序设计(第三版) JavaScript权威指南(第六版)
winter的原型链深究: http://www.cnblogs.com/winter-cn/archive/2009/05/16/1458390.html