2012-01-29 72 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