2015-01-07 2 views
2

Если вы посмотрите на этот код:Может ли функция javascript быть классом и экземпляром другого объекта?

function supportAggregate(Meanio) { 

     Meanio.prototype.aggregated = function(ext, group, callback) { 
     // Aggregated Data already exists and is ready 
     if (Meanio.Singleton.config.clean.aggregate === false){ 
      return callback(''); 
     } 
     if (aggregated[group][ext].data) return callback(aggregated[group][ext].data); 

     // No aggregated data exists so we will build it 
     sortAggregateAssetsByWeight(); 

     // Returning rebuild data. All from memory so no callback required 
     callback(aggregated[group][ext].data); 
     }; 

     Meanio.prototype.aggregatedsrc = function(ext, group, callback) { 
     // Aggregated Data already exists and is ready 
     if (Meanio.Singleton.config.clean.aggregate !== false){ 
      if(ext==='js'){ 
      if(group==='header'){ 
       return callback(['/modules/aggregated.js?group=header']); 
      }else{ 
       return callback(['/modules/aggregated.js']); 
      } 
      }else if(ext==='css' && group==='header'){ 
      return callback(['/modules/aggregated.css']); 
      } 
      return callback([]); 
     } 
     if (aggregated[group][ext].src) return callback(aggregated[group][ext].src); 

     // No aggregated data exists so we will build it 
     sortAggregateAssetsByWeight(); 

     // Returning rebuild data. All from memory so no callback required 
     callback(aggregated[group][ext].src); 
     }; 

     // Allows rebuilding aggregated data 
     Meanio.prototype.rebuildAggregated = function() { 
     sortAggregateAssetsByWeight(); 
     }; 

     Meanio.prototype.Module.prototype.aggregateAsset = function(type, asset, options) { 
     options = options || {}; 
     if (!options.inline && !options.absolute && !options.url) { 
      asset = path.join(Meanio.modules[this.name].source, this.name, 'public/assets', type, asset); 
     } 
     Meanio.aggregate(type, asset, options, Meanio.Singleton.config.clean); 
     }; 

     Meanio.onModulesFoundAggregate = function(ext, options) { 
     var config = Meanio.Singleton.config.clean; 
     var aggregator = new Aggregator(options, false, config); 
     for (var name in Meanio.modules) { 
      aggregator.readFiles(ext, path.join(process.cwd(), Meanio.modules[name].source, name.toLowerCase(), 'public')); 
     } 
     }; 

     Meanio.aggregate = function(ext, asset, options, config) { 
     var aggregator; 
     options = options || {}; 
     if (!asset) { 
      return; 
     } 
     aggregator = new Aggregator(options, true, config); 
     if (options.inline) return aggregator.addInlineCode(ext, asset); 
     else if (options.url) return aggregator.getRemoteCode(ext, asset); 
     else if (options.singlefile) return aggregator.processDirOfFile(ext, asset); 
     else return aggregator.readFile(ext, path.join(process.cwd(), asset)); 
     }; 

     Meanio.prototype.aggregate = Meanio.aggregate; 
    } 

    module.exports = supportAggregate; 

(https://github.com/linnovate/meanio/blob/master/lib/aggregation.js#L213)

Вы можете видеть, что существует два типа функций для Meanio, которые созданы. Также, кстати, вы можете увидеть, где это описано здесь: https://github.com/linnovate/meanio/blob/master/lib/mean.js#L114

Но я просто смущен. Когда-нибудь, функция Meanio определяется следующим образом:

Meanio.prototype.myfunction = function() {} 

, а иногда они определяются следующим образом:

Meanio.myfunction = function() {} 

Я просто не понимает; хотя я чувствую, что инъекция зависимости каким-то образом связана.

Как это может быть? Как объект может быть как классом, так и самим экземпляром?

Этот код очень смущает меня, и я был бы очень признателен, если бы кто-то мог пролить свет на это для меня. Я не прошу вас внимательно изучать код, но если бы вы могли дать мне общее понимание, это было бы здорово.

Заранее благодарен!

+2

Функция может иметь свойства, а также прототип. Свойства будут доступны непосредственно на функции, но не на экземплярах функции (класс, конструктор, что угодно). –

+1

У JavaScript нет классов, поэтому применение правил с других языков программирования, которые имеют их, неизбежно вызывает путаницу. – JJJ

ответ

3

Как объект может быть как классом, так и экземпляром самого себя?

Это не то, что происходит здесь. Объектом, переданным функции, является экземпляр.

Функция, однако, изменяет как экземпляр, который вы передаете ему, так и класс этого экземпляра.

Если вы создаете два экземпляра одного класса и передаете одну из них функции, другой экземпляр не изменяется, но класс, который является общим для них, изменяется. Пример:

function MyClass() {} 

var a = new MyClass(); 
var b = new MyClass(); 

supportAggregate(a); 

Теперь оба a.rebuildAggregated и b.rebuildAggregated существует, так как, что добавляется к классу. a.onModulesFoundAggregate существует, потому что он добавлен в экземпляр, но b.onModulesFoundAggregate не существует.

(Примечание: пример на самом деле не будет работать, поскольку происходит еще больше. У класса должно быть несколько свойств для работы с этой функцией, пример должен показать только разницу между свойствами, добавленными к прототипу и к примеру.)

0

Скажем, у меня есть конструктор

// First I will define a constructor 
function MyClass() { 
    this.classproperty = 1; 
} 

в JavaScript конструктор также является экземпляром объекта. Когда я использую это ключевое слово внутри конструктора, я говорю, что хочу создать новое свойство внутри специального объекта, присутствующего во всех объектах javascript, называемых прототипом.

// Then I add a new property without using prototype obj 
MyClass.newProperty = 2; 

alert(MyClass.classproperty); // alert 1 
alert(MyClass.newProperty); // alert 2 
          // It will work because I'm using the MyClass main Object 

При создании нового экземпляра из Myclass Obj.Новый созданный объект наследует прототип объекта от родителя (тот, используемый для создания экземпляра), но не свойства, добавленные прямо в MyClass OBJ:

var instance = new MyClass(); 
alert(instance.newProperty); // undefined because the new instance will 
          // inherit only what is inside prototype obj 

Я должен добавить его в объект-прототип для того, чтобы новые экземпляры наследует свойство;

Myclass.prototype.newProperty = 2; 
var instance = new Myclass(); 
alert(instance.newProperty) // alert 2 

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

  • Нет связанных вопросов^_^