2011-06-20 75 views
2

我看到了Stijn de Witt爲Javascript中的definine枚舉提供的解決方案。使用默認值的var原型

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". 

我想嘗試定義。名稱爲默認, 這樣我就可以寫的東西,如:

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

或者只是

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

回答

1

我能想到的唯一辦法是hackish的和不可取的,但這裏有雲:

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

alert(RRR + RRR.date); 

而不是使用一個字符串爲您name,這是借用一個String包裝對象是你的對象與價值的"RRRaney:",並將date屬性添加到該包裝器對象。

它給出你想要的結果,但嚴重的是,不要這樣做。只要堅持一個典型的對象文字。


您在問題的標題中提到了prototype

如果你正在考慮一個構造函數,給出了一個默認name爲它創建的對象,這是一個不同的故事:

var MyConstructor = function(date) { 
    this.date = date; 
}; 

MyConstructor.prototype.name = "RRRaney:"; 

var inst = new MyConstructor("2007"); 

但它不會在你想要的方式代表RRR

+0

dw - 這也是我的駭人嘗試,但我甚至不想寫回應。這不應該做。 ;) –

+0

@ g.d.d.c:是的,我現在覺得很骯髒。哦,太髒了。 – user113716

3

嗯,這可能是一個壞主意,我不知道其他的瀏覽器將如何處理這個問題,但這部作品在鍍鉻...

http://jsfiddle.net/yvgj8/

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

alert(RRR + " " + RRR.date); 

沒想到這居然會工作,所以很可能在其他瀏覽器中不會。

+0

+1我喜歡。我也會對瀏覽器支持感到好奇。 – user113716

+0

檢查IE6和IE8,它的工作原理,非常有趣。在Java中的常見做法,但我並沒有真正期望它在js中工作。實際上非常有用。 –

+0

+1 ...在FF和IE8中工作...這真的很光滑 – Gerrat

0

我不確定我是否應該寫這個,因爲它與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