2012-01-29 73 views
3

我可以向對象添加一些功能,當訪問未定義的對象屬性時,該對象將返回默認值?在javascript中處理未定義的屬性

例如是這樣的:

var obj = { 
    a:1, 
    b:2, 
    // can i add some functional here, which 
    // will return default value 
    // when accessing a missing property 
    // for example "property "+prop+" missing in obj"? 
} 
alert(obj.c) // "property c missing in obj" 

是沒有辦法做到的呢?

+0

老兄......我想你會盡你所能爲一些非標準數據設置自定義getter和setter以及處理程序。你是爲了某些客戶端功能而編寫的,還是這是一些SSJS? – Relic 2012-01-30 00:57:03

回答

0

你想要什麼是JavaScript proxies。但是,瀏覽器對它們的支持很薄弱。

如果您希望程序在所有現代瀏覽器上運行,則不應使用代理;但是,如果您使用的是JavaScript服務器端或在其他限制的環境中,則它是一個選項。例如,我認爲Node.js支持它們(儘管我可能在這方面是錯誤的)。

如果你工作在跨瀏覽器的代碼,然後我不知道任何干淨的方式來實現你想要的功能。

+0

我需要它代理一些對象,使它可以從web工作者通過postMessage這個對象的所有屬性到主腳本中的同一對象,例如控制檯 – elser 2012-01-29 23:50:45

+0

不,我只在webkit瀏覽器上工作,因爲我創建了一個複雜產品,其中還包含基於Linux的工作空間的硬件 - 服務器機架,網絡和客戶端工作站。 它不是一個公共Web項目,所以我需要它在孤立的Web環境中使用Web工作站來優化客戶端evristic。 我的網頁前端使用了很多像OpenLayers,extjs和其他的javascript框架,並且在客戶端和許多不同的服務器(如賬單信息,gps監控數據,視頻流等)之間使用了很多數據流。 – elser 2012-01-30 05:07:51

+0

在幾種情況下web界面會卡住,所以我需要將很多代碼移入並行進程,並且在大多數情況下,我不知道在某些代碼中將使用哪些全局對象。 我不想寫自己的例子DOM實現模擬器與所有的DOM屬性和方法,所以我需要路由缺少的部分到主要腳本 – elser 2012-01-30 05:18:06

0

試試這個:

alert((obj.c!=undefined)?obj.c:"Undefined"); 

要真正回答你的問題,你不應該找一個對象不存在的屬性或方法。如果你碰巧在循環一個對象屬性,你使用[]符號而不是點符號,比如。

var x, obj = {...} 

for(x in obj){ 
    alert("Property name:"+x+" | value: "+obj[x]); 
} 

而且可以隨時換任何說法是值得商榷的一個try/catch。

或函數,而不是對象常量:

var obj = function(Params){ 
    this.URL = ""; 
    this.QueryString = new Array(); 
    this.Params = Params; 
    this.Method = "POST"; 
    this.CallBack = ""; 
    this.OnSuccess = ""; 
    this.OnFailure = ""; 
    this.Header = "application/x-www-form-urlencoded"; 
    this.Response = ""; 

    for(var Param in this.Params){ 
     switch (Param){ 
      case 'URL' : this.URL = this.Params[Param]; break; 
      case 'QueryString' : this.QueryString = this.Params[Param];break; 
      case 'Header' : this.Header = this.Params[Param]; break; 
      case 'Method' : this.Method = this.Params[Param]; break; 
      case 'CallBack': this.CallBack = this.Params[Param]; break; 
      case 'OnSuccess': this.OnSuccess = this.Params[Param]; break; 
      case 'OnFailure': this.OnFailure = this.Params[Param]; break; 
       case default: something(); break; //I just don't have this line because I didn't need a default; 
     } 
    } 

} 

以上是開始一個Ajax對象我寫的,但你的想法..

+0

以Relic:不,我需要一個反射代理 - 在obj內測試屬性可用性 - 而不是外部測試 這將用於通過postMessage方法將缺少的屬性路由到web worker外部的相同命名對象 – elser 2012-01-30 00:30:18

+0

@elser那麼你將在哪裏調用可能定義或不定義的屬性?你是否生成屬性,然後不確定哪些屬性被設置?如果我有更多的信息,那麼您可能已經有了一個數據解決方案。如果你一次只做一個,你可以使用上面的條件:'if(obj。* === undefined){}' – Relic 2012-01-30 00:37:24

+0

我想也許嘗試設置你的對象作爲一個函數,而不是一個對象文字。 ..我們可以聊天,我有一些代碼,你應該看看 – Relic 2012-01-30 00:40:30