Если вы посмотрите на этот код:Может ли функция 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() {}
Я просто не понимает; хотя я чувствую, что инъекция зависимости каким-то образом связана.
Как это может быть? Как объект может быть как классом, так и самим экземпляром?
Этот код очень смущает меня, и я был бы очень признателен, если бы кто-то мог пролить свет на это для меня. Я не прошу вас внимательно изучать код, но если бы вы могли дать мне общее понимание, это было бы здорово.
Заранее благодарен!
Функция может иметь свойства, а также прототип. Свойства будут доступны непосредственно на функции, но не на экземплярах функции (класс, конструктор, что угодно). –
У JavaScript нет классов, поэтому применение правил с других языков программирования, которые имеют их, неизбежно вызывает путаницу. – JJJ