深入 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 ...)

 

posted @ 2013-05-14 10:09  zhongsp  阅读(1459)  评论(0编辑  收藏  举报