【问题标题】:Using namespace constants as object keys? [duplicate]使用命名空间常量作为对象键? [复制]
【发布时间】:2025-12-14 13:30:01
【问题描述】:

我想在我的 Javascript 对象中使用字符串常量而不是直接字符串(在定义参数键等时)。目的是让我的代码被 IDE 索引,提供建议、自动更正/完成,以及所有防错的好东西。

我想为这个类EPPZObject的构造函数定义显式键,所以我做了:

var EPPZ =
{
    width: 'width',
    height: 'height'
}

var EPPZObject = Class.extend
({

    construct: function(parameters)
    {
        // Constant usage works fine here.
        log(parameters[EPPZ.width]);
        log(parameters[EPPZ.height]);
    }

});

在客户端代码中,我也可以使用常量:

log(EPPZ.width); // Logs 'width' just fine.
log(EPPZ.height); // Logs 'height' just fine.

但是当我想在构建时使用 const (实际上这就是重点),那么它就不起作用了:

var objectThatWorks = new EPPZObject(
        {
            'width' : '9',
            'height' : '9',
        });

var objectThatNotWorks = new EPPZObject(
        {
            EPPZ.width : '9',
            EPPZ.height : '9',
        });

上面写着:

Uncaught SyntaxError: Unexpected token . 

如何克服这个问题?有没有类似干净的解决方案来使用常量?

【问题讨论】:

  • 也许问题是How to use expressions as associative array keys at declaration time?
  • 您不能在对象文字中使用变量。也许您应该寻找一些 makro 预处理器,而不是将名称定义为 js 变量。这些常量永远不会改变,为什么要让它们动态呢?
  • 我只想让我的 IDE (PHPStorm) 在键入构造函数时自动更正/自动建议。我想要索引所有参数键。我敢打赌“外国”预处理器不会为我这样做。
  • JavaScript 中没有 Class 之类的东西
  • @Alex: function Class(){}Class.prototype.construct=function(){};Class.extend=function(e){var t=function(){if(arguments[0 ]!==Class){this.construct.apply(this,arguments)}};var n=new this(Class);var r=this.prototype;for(var i in e){var s=e[i ];if(s instanceof Function)s.$=r;n[i]=s}t.prototype=n;t.extend=this.extend;return t}

标签: javascript namespaces constants public


【解决方案1】:

你不能像这样做一个单例吗?:

var EPPZ = {
        width : '9',
        height : '9'
};

然后也许

var objectThatWorks = new Object();
objectThatWorks.width = EPPZ.width;
objectThatWorks.height = EPPZ.height;

编辑

您是否尝试过原型设计?

EPPZObject.prototype.width = EPPZ.width;

【讨论】:

  • 我将使用常量作为键,而不是值。但这与我刚刚想出的接近 -> 使用中间对象。
【解决方案2】:

可以以一种非常奇怪的方式解决。不确定我是否会在生产中使用它。

使用将参数“翻译”成对象的辅助对象:

var Parameters = Class.extend
({
    construct: function(parameters)
    {
        for (var index = 0; index < parameters.length; index += 2)
        { this[parameters[index]] = parameters[index+1]; }
    }
});

现在我几乎可以按照我想要的方式构造对象了……

var object = new EPPZObject(new Parameters(
[
    EPPZ.width, 8,
    EPPZ.height, 9,
]));

...但也添加了一些样板文件:(

【讨论】: