基础知识点 关于 prototype  __proto__

供js新手参考

 JavaScript 的一些基础知识点:

  1. 在 JavaScript 中,所有对象 o 都拥有一个隐藏的原型对象(在 Firefox 中是 o.__proto__)。该隐藏原型对象拥有一个 constructor 成员,指向该对象的构造函数。当读取对象成员 o.member 时,会顺着原型链往上回溯。因此我们可以得到o.constructor === o.__proto__.constructor. 这是最基本的知识点,不多说。
  2. 在 JavaScript 中,所有函数声明在解析后,都自动拥有一个 prototype 成员。该 prototype 成员拥有一个自动添加的 constructor 成员,指向函数本身。也就是Fn === Fn.prototype.constructor.
  3. 函数 Fn 本身也是对象,因此Fn.constructor === Fn.__proto__.constructor, 注意Fn.__proto__ !== Fn.prototype, 千万不要混淆了。
  4. var fn = new Fn(),在 Firefox 下,不考虑参数传递,可以用下面的代码来表示 new 的过程:
    var o = {__proto__: Fn.prototype};
    Fn.apply(o);
    fn = o;
    
  5. 上面第 4 点是第 1 点的原因,因为任何一个对象都源自函数构造器,比如 var a = {} 可以等价为:
    var o = {__proto__: Object.prototype};
    Object.apply(o);
    a = o;
    

    因此所有对象都具有 constructor 成员。

上面 5 点可以归结为 2 点:构造函数的实例化过程和对象成员的原型链回溯机制。理解了这两点,市面上 JavaScript 的各种各样 OOP 机制,比如 Dean Edwards 的 Base.extend,MooTools 里的 new Class, 以及《悟透 JavaScript》里的甘露模型等等,就都能轻松轻松理解了。

 posted on 2013-08-02 19:03 落叶满长沙 阅读(...) 评论(...) 编辑 收藏