Javascript requirejs如何提供新的;“类”;每个文件的实例是否定义了基于文件名的属性?

Javascript requirejs如何提供新的;“类”;每个文件的实例是否定义了基于文件名的属性?,javascript,requirejs,publish-subscribe,mediator,Javascript,Requirejs,Publish Subscribe,Mediator,用例实现了一个中介模式,其中每个实例都是posal.js通道 用实际代码解释它需要一些postal.js知识,因此我下面的示例在概念上类似,但只使用requirejs // animalSounds.js define([],function(){ return { cat:'meow', dog:'woof' }; }); // animalFactory.js ... the requirejs plugin define(['animalSounds'],func

用例实现了一个中介模式,其中每个实例都是posal.js通道

用实际代码解释它需要一些postal.js知识,因此我下面的示例在概念上类似,但只使用requirejs

// animalSounds.js
define([],function(){
  return {
    cat:'meow',
    dog:'woof'
  };
});

// animalFactory.js ... the requirejs plugin
define(['animalSounds'],function(animalSounds){
  function animalClass(name){
    this.sound = animalSounds[name];
  }
  return {
    load:function(name, req, onload, config){
      onload(new animalClass(name)); 
    }
  }
});

// cat.js
define(['animalFactory'],function(animalInstance){
  animalInstance.sound === 'meow'; // should be true
});

// dog.js
define(['animalFactory'],function(animalInstance){
  animalInstance.sound === 'woof'; // should be true
});

基本上,它是一个在需要时返回新实例的工厂。我能创造的部分很好。我正在努力的是根据模块的要求从其他来源获取动态属性。虽然我可以将密钥定义为每个文件中的字符串,但我希望使用文件名作为密钥来保持干燥。

我只需稍微打破干燥原则,使用
cat
,例如:

define(['animalFactory!cat'],function(animalInstance){
  animalInstance.sound === 'meow'; // should be true
});
事实上,虽然可以使用加载器实现您想要的功能,但生成的代码会很复杂,并且会模糊应用程序的逻辑。例如,多次要求
animalFactory
并期望得到不同的结果(这是您在问题中遇到的)违背了RequireJS的一个基本原则:反复要求相同的模块名称应该反复返回相同的值


请注意,可以要求使用
模块
模块(这是一个特殊模块),然后使用
module.id
了解您所在模块的名称,但遗憾的是,这无法用于在
定义
上构建依赖项列表。module.id成功了。我正在为应用程序文件使用require。核心的扩展通过window.sandbox(fn)获得自己的沙盒通信通道,它通过内部定义(['module','sandbox')返回一个新的沙盒。在实例化沙盒时隐藏require use甚至比插件更好。好极了亚当,我已经把你的编辑退回了。因此,编辑实践是,答案不应该出现在问题中。(如果你在其他问题上看到过,那么他们的作者错误地违反了SO惯例。不幸的是,我们无法抓住每一个案例。)如果你想发布问题的答案,你应该在问题下方以正式答案的形式提交。明白。感谢您的沟通,除了改变它。如果评论允许格式化,我会将其作为对您答案的评论提交。不过这并不重要。