【问题标题】:var prototypes with a default value具有默认值的 var 原型
【发布时间】:2011-06-20 20:48:37
【问题描述】:

我从 Stijn de Witt 看到了一个解决方案,用于在 Javascript 中定义枚举。

var SIZE = {
  SMALL : {value: 0, name: "Small", code: "S"},    
  MEDIUM: {value: 1, name: "Medium", code: "M"},    
  LARGE : {value: 2, name: "Large", code: "L"}
};

用法:

alert(SIZE.SMALL.value);
...

我一直在尝试调整它以允许我定义用户。

var RRR : {name: "RRRaney:, number: 2, date: 2007};

这符合我的预期:

alert(RRR.name + " " + RRR.date); //to display the text "RRRaney 2007". 

我想尝试将 .name 定义为默认值, 所以我可以写这样的东西:

alert(RRR + " " + RRR.date);      //to display the text "RRRaney 2007".

或者只是

alert(RRR);                      // to display the text "RRRaney".

【问题讨论】:

    标签: javascript prototype-programming


    【解决方案1】:

    嗯,这可能是个坏主意,我不知道其他浏览器会如何处理这个问题,但这适用于 chrome...

    http://jsfiddle.net/yvgj8/

    var RRR = {
                 name: "RRRaney", 
                 number: 2, date: 2007, 
                 toString: function(){
                    return this.name;
                 }
              };
    
    alert(RRR + " " + RRR.date);
    

    没想到这真的会起作用,所以在其他浏览器中可能不会。

    【讨论】:

    • 在 IE6 和 IE8 中检查,它可以工作,非常有趣。 Java 中的常见做法,但我真的没想到它可以在 js 中工作。实际上非常有用。
    • 完美,谢谢。 var USER = {RRR : {name: "RRRaney", date: 2007, toString: function() {return this.name}}};
    【解决方案2】:

    我能想到的唯一方法是骇人听闻和不可取的,但就是这样:

    var RRR = new String("RRRaney:");
    RRR.date = "2007";
    
    alert( RRR + RRR.date );
    

    不是为您的name 使用字符串文字,而是借用一个字符串包装器对象作为您的值为"RRRaney:" 的对象,并向该包装器对象添加一个date 属性。

    它给出了你想要的结果,但说真的,不要这样做。只需坚持使用典型的对象字面量即可。


    您在问题的标题中提到了prototype

    如果您正在考虑为它创建的对象提供默认 name 的构造函数,那就另当别论了:

    var MyConstructor = function( date ) {
        this.date = date;
    };
    
    MyConstructor.prototype.name = "RRRaney:";
    
    var inst = new MyConstructor( "2007" );
    

    但它并不能以您想要的方式代表RRR

    【讨论】:

    • dw - 这也是我的骇客尝试,但我什至不想写回复。不应该这样做。 ;)
    【解决方案3】:

    我不确定我是否应该写这个,因为它与 kingjiv 的回答精神相同。但它略有不同,所以我决定无论如何都放在这里。

    function enum(name, value, date) {
        this.name = name;
        this.value = value;
        this.date = date;
    }
    enum.prototype.toString = function() {
        return this.name;
    }
    

    用法是:

    RRR = new enum("RRRaney", 2, 2007);
    alert(RRR + " " + RRR.date);
    

    编辑:对象名称的不幸选择。显然enum 是 javascript 1.3+ 中的保留关键字,因此代码在 Internet Explorer 中失败。如果您想使用它,您需要将其重命名为 Enum 或类似的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 2017-08-21
      • 2020-05-04
      相关资源
      最近更新 更多