如何在自定义AMD dojo小部件中定义公共常量

如何在自定义AMD dojo小部件中定义公共常量,dojo,Dojo,在dojo 1.6之前,我曾经这样定义公共常量: dojo.declare('x.y.Z', null, { ... }); x.y.Z.constant = 100; define(["dojo/_base/declare"], function(declare) { var MyWidget = declare([], { //Define your widget as usual }); MyWidget.someConstant = "42"; retur

在dojo 1.6之前,我曾经这样定义公共常量:

dojo.declare('x.y.Z', null, { ... });

x.y.Z.constant = 100;
define(["dojo/_base/declare"], function(declare) {
  var MyWidget = declare([], {
    //Define your widget as usual
  });

  MyWidget.someConstant = "42";

  return MyWidget;
});
require(["MyWidget"], function(MyWidget) {
  console.debug(MyWidget.someConstant); // Prints out "42"
});
这样就可以从其他代码访问它们,而无需实例化类

由于Dojo1.7,我的小部件可能会被重命名或移动。因此,我不应该在代码中使用绝对模块ID


定义这样一个常量的好方法是什么?

我将在窗口对象内创建一个对象:

window.myConstants={};
window.myConstants.c1=100;
您可以从代码中的任何位置访问myConstants对象,因为它是一个全局对象


javascript中没有真正的常量。

如果试图将其附加到已定义的小部件类,可以执行以下操作:

dojo.declare('x.y.Z', null, { ... });

x.y.Z.constant = 100;
define(["dojo/_base/declare"], function(declare) {
  var MyWidget = declare([], {
    //Define your widget as usual
  });

  MyWidget.someConstant = "42";

  return MyWidget;
});
require(["MyWidget"], function(MyWidget) {
  console.debug(MyWidget.someConstant); // Prints out "42"
});
现在你可以这样使用它:

dojo.declare('x.y.Z', null, { ... });

x.y.Z.constant = 100;
define(["dojo/_base/declare"], function(declare) {
  var MyWidget = declare([], {
    //Define your widget as usual
  });

  MyWidget.someConstant = "42";

  return MyWidget;
});
require(["MyWidget"], function(MyWidget) {
  console.debug(MyWidget.someConstant); // Prints out "42"
});

这将是一个全局常数。我想把它和我的小部件结合起来。我对这个解决方案的担心是它不是一个常数,它是一个类似于附加到类上的“静态”的变量。绝对没有什么可以阻止某人做
MyWidget.someConstant=“newvalue”OP要求替换某些Dojo 1.6功能;该属性在Dojo1.6中也不是不可变的。尽管如此,这种模式仍然适用。您可以冻结()小部件,或者至少冻结()包含所有常量的对象(尽管您仍然可以替换该对象)。或者你可以,你知道,只是不修改它。