深入 JavaScript(3) - 揭开 Javascript 类和继承的神秘面纱!
继续上篇(深入JavaScript - 对象, 一切皆对象?)开讲. 建议先阅读它 :)
在上一篇中, 主要谈的是 Javascript 内置对象的 prototype 以及 __proto__ 属性.
1. Js 引入 prototype 机制来实现属性和方法的共享, 每个构造函数(constructor)在定义时, Js 会为它自动添加 prototype 属性.
注意: 上面说的是构造函数, 它是一个函数对象, 是一个 Js 函数... 而非普通对象, 普通对象不会自动添加 prototype 属性!
// 我所说的普通对象.. Detail = { 'game': 'World of Warcraft', 'class': 'Priest', 'spell': 'Holy Nova', 'description': 'Causes an explosion of holy light around the caster, causing 307 to 356 (+ 14.3% of SpellPower) Holy damage to all enemy targets within 10 yards and healing up to 5 targets within 10 yards for 2373 to 2756 (+ 24.7% of SpellPower). Healing is divided among the number of targets healed. These effects cause no threat.' }
函数对象:
function foo() { // Body goes here } var boo = function() { // Body goes here } ;(function() { // Body goes here });
2. __proto__, 这个东西有个中文名, 你们知道叫什么吗?.. 那就是: 隐式的引用 它的构造函数的 prototype 属性. 它的应用范围比 prototype 大一些, 因为所有的对象都有这个属性. 也就是说: 所有的对象都会隐式的引用它的构造函数的prototype, 同时 构造函数的prototype(原型对象)也是一个对象, 它又同时会隐式的引用其构造函数的prototype对象!
那这里就会出现一条链. 它就是原型链了! 这条链不是无限长的, 它结束于 Object.prototype.__proto__. 因为
Object.prototype.__proto__ === null
总结一下:
constructor.prototype 构造函数的prototype对象是用来给constructor构造出来的对象继承用的.
这个构造器和它自身的属性prototype只是 '简单的' 对象和属性的关系而已, 我们要通过构造器来修改更新prototype对象.
构造器中的 __proto__ 是真正与这个构造器息息相关的, 构造器继承了__proto__ 指向的对象的属性和方法.
用构造器 new 出来的实例对象里的 __proto__ 指向了 构造器的prototype, 也就是继承了 constructor.prototype 对象.
所以说, 构造器的prototype属性是为实例对象服务的, 用来初始化实例对象的 __proto__.
待续...(楼主去办有线电视了 - - , 下一篇聊聊 new ...)