2013-12-22 5 views
2

У меня есть этот кусок кода (от «Секреты Javascript ниндзя»):Javascript подклассу код объяснение

(function() { 
    var initializing = false, 
     superPattern = /xyz/.test(function() { xyz; }) ? /\b_super\b/ : /.*/; 

    Object.subClass = function(properties) { 
    var _super = this.prototype; 

    initializing = true; 
    var proto = new this(); 
    initializing = false;  

    for (var name in properties) { 

     proto[name] = typeof properties[name] == "function" && 
        typeof _super[name] == "function"  && 
        superPattern.test(properties[name]) ? 
     (function(name, fn) { 
      return function() { 
      var tmp = this._super; 

      this._super = _super[name]; 

      var ret = fn.apply(this, arguments); 
      this._super = tmp; 

      return ret; 
      }; 
     })(name, properties[name]) 
     : 
     properties[name]; 
    } 

    function Class() { 
     if (!initializing && this.init) { 
     this.init.apply(this, arguments); 
     } 
    } 

    Class.prototype = proto; 
    Class.constructor = Class;    // Why do we need this? 
    Class.subClass = arguments.callee;  // Why is this not Object.subClass? 
    return Class; 

    }; 

})(); 

var Person = Object.subClass({ 
    init: function(isDancing) { 
    this.dancing = isDancing; 
    return true; 
    }, 
    dance: function() { 
    return this.dancing; 
    } 
}); 

var person = new Person(true); 
alert (person.dance()); 

Я с трудом понять 2 вещи:

  1. Почему Class.constructor = Class ?
    Зачем нам вообще переопределять его? Я попытался прокомментировать это, и все получилось отлично.
  2. Почему у нас есть Class.subClass = arguments.callee?
    Я пробовал использовать Class.subClass = Object.subClass (что имеет смысл?), И, похоже, он работает нормально.
+0

Я думаю, что ваш вопрос просто ответил на мой вопрос [ссылка] (http://stackoverflow.com/questions/20733249/ruby-code-blocks-versus-javascript-anonymous-functions-distiction) – ialexander

ответ

2

Почему Class.constructor = Class?

Я не знаю, это не имеет никакого смысла. Вероятно, это должно было быть proto.constructor = Class;.

Почему у нас есть Class.subClass = arguments.callee? Я попытался использовать Class.subClass = Object.subClass (что имеет больше смысла?), И, похоже, он работает нормально.

Да, это он имел в виду. arguments.callee устарел, но имеет тот же эффект. Ваша версия лучше.

Вы также можете взглянуть на Is John Resig's Javascript inheritance snippet deprecated?.

Смежные вопросы