javascript継承に対する理解

3368 ワード

javascriptは元々サポートされていないタイプですから、継承や多状態はもちろん、他の対象向けプログラミング言語の特性を模擬するために、多くの大牛が実現方法を書いてくれました.John Resignの「Simple JavaScript Inhersitance」という文章を見て、感服されました.もとは短い何十行のjavascriptもこのように強大で、優雅なことができて、次に私の理解の方式で解読します.
父の名前を受け継ぎ、訪問する方法を主に実現しましたが、残念なことにメンバー変数/関数の隠し方ができませんでした.

(function(){
  //     , new A()      B=A.extends({/*   */})   ;
  var initializing = false,
      //fnTest            /\b_super\b/  /.*/
      //    test          toString()        
      fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
    
  //         Class  
  this.Class = function(){};
    
  //       
  Class.extend = function(prop) {
    //   _super     prototype,            、        
    var _super = this.prototype;
      
    //  B=A.extends({/*   */});
    initializing = true;
    //     ,             prototype
    var prototype = new this();
    initializing = false;
    //  B=A.extends({/*   */});
      
    //                 
    //       :
    //1、      prototype 
    //2、      this._super()          ,         prototype 
    //3、      this._super()          ,               prototype :
    //    this._super         ,                  
    for (var name in prop) {
      //            ,          
      //          v = a && b && c ? d : e;     v = (a && b && c) ? d : e
      //                      a,b,c  true v=d,  v=e
      //a   prop[name]     ,b             name  ,c    name               (    this._super())
      //d  a,b,c       ,    :name   , name        ,    name              
      // a,b,c           prop[name] prototype[name]
      prototype[name] = typeof prop[name] == "function" &&
        typeof _super[name] == "function" && fnTest.test(prop[name]) ?
        (function(name, fn){
          //  ,       prototype[name]    ,           
          return function() {
            //      ,    fn    this._super
            //  return    function,                 fn this        
            //    _super    _super, this._super    ,          
            //var tmp = this._super;
            //this._super   fn( prop[name])       ,  fn    
            //          this._super()           
            this._super = _super[name];
            //       ,     this._super            , _super[name]
            var ret = fn.apply(this, arguments);   
            //this._super = tmp;
            //      
            return ret;
          };
        })(name, prop[name]) :
        prop[name];
    }
      
    // “Class”     “Class”     
    //  Class         
    function Class() {
      //  A.extends({/*   */})   
      if ( !initializing && this.init )
        this.init.apply(this, arguments);
    }
      
    //      prototype      prototype
    Class.prototype = prototype;
      
    //      
    Class.prototype.constructor = Class;
    
    //             
    Class.extend = arguments.callee;
      
    return Class;
  };
})();
もっと深くjs継承を知りたいなら、続けて文章を調べてください.