【问题标题】:How to assign a static array to an object in Dojo?如何将静态数组分配给 Dojo 中的对象?
【发布时间】:2012-08-15 07:59:41
【问题描述】:
define(["dojo/_base/declare"], function (declare) {
    // module:
    //      StyleNames
    // summary:
    //      Style element names.
    var StyleNames = declare(null, 
        {
            PROP1: "Style1",
            PROP2: "Style2"
        }
    );

    StyleNames.dataContexts = [
        StyleNames.PROP1,
        StyleNames.PROP2,
    ];

    return StyleNames;
});

var styleNames = new StyleNames();
console.log("PROP1 is defined as: ", styleNames.PROP1); // prints "Style1"
console.log("dataContexts is undefined: ", styleNames.dataContexts); // Error: styleNames.dataContexts is undefined

我的设置类似于https://stackoverflow.com/a/11329956/1610451,但查看 DOM,我可以看到它设置为构造函数 styleNames.constructor.dataContexts,但值未定义。

背景故事:我正在将 ActionScript 代码移植到 JavaScript,并且需要维护现有接口。我要移植的 ActionScript 代码示例如下:

public class StyleNames {
    public static const PROP1 : String = "Style1";
    public static const PROP2 : String = "Style2";

    public static const dataContexts : Array = [
        PROP1,
        PROP2
    ];

    public function StyleNames(){}
}

【问题讨论】:

    标签: javascript actionscript dojo


    【解决方案1】:

    您的声明中正确无误。在我看来,这是定义静态变量的最明确的方式。在您的console.log 代码中,您只是没有正确引用dataContexts 变量。它是一个 static 变量,因此它不属于任何一个实例。你想这样引用它:StyleNames.dataContexts

    编辑:您还可能在其中遇到语法错误。去掉StyleNames.dataContexts声明下的第二个逗号:

    StyleNames.dataContexts = [
        StyleNames.PROP1,
        StyleNames.PROP2
    ];
    

    像这样访问变量:

    StyleNames.dataContexts
    

    相对于this.dataContextsinstanceRef.dataContexts

    【讨论】:

    • 虽然尾随逗号确实令人恐惧,但实际上没有现代浏览器会扼杀它,IE7或8“修复”了这个致命的“错误”。不过,还是小心点比较好。但是现代浏览器不在乎(例如 PHP 也不在乎)。
    • 好点,@JaredFarrish。我知道我以前被这个咬过,但我不记得哪些浏览器会因此而窒息。
    • 感谢您的回复!我忽略了我曾尝试将其引用为静态(“StyleNames.dataContexts”),但这也给出了未定义的错误。我还尝试在构造函数中创建实例变量,但在声明之外设置值。删除多余的逗号也无济于事:(
    • 你是对的,OP也是。在声明中,eval(declaredClass).StaticName 引用的简单变量就是这样创建的。但是,所述模块的实例与其“静态”内容之间没有继承关系。
    • 知道了,谢谢!诀窍是将其他变量放置为静态(无论如何它们都应该是这样)。我以为我已经尝试过了,但是哦,这就是我周末工作的结果。 @phusick 的答案是正确的,但这个答案从一开始就是正确的。
    【解决方案2】:

    按照我的思路,这是正确的做法:

    require(["dojo/_base/declare"], function(declare) {
    
        var StyleNames = declare(null, {
    
            constructor: function() {
                // a.k.a public function StyleNames(){}
            },
    
            // non-static properties and functions here
    
        });
    
        // static properties and functions
        StyleNames.PROP1 = "Style1";
        StyleNames.PROP2 = "Style2";
    
        StyleNames.dataContexts = [
            StyleNames.PROP1,
            StyleNames.PROP2
        ];
    
        console.log("PROP1: ", StyleNames.PROP1);
        console.log("dataContexts: ", StyleNames.dataContexts);
    
    });​
    

    在 jsFiddle 上查看一个工作示例:http://jsfiddle.net/phusick/6nfhJ/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 2020-02-04
      相关资源
      最近更新 更多