10

这是一个长镜头...

在 Javascript 中,我正在访问一个我确定存在的对象属性,但我的键名中有一个错字,因此返回undefined并创建了一个错误。

如何编写与以下等效的代码,但由于密钥不存在而引发错误?

var obj = {'myKey': 'myVal'},
    val = obj.myKye;

我试图找到一个解决方案,它不需要我编写每次我想访问对象成员时使用的包装函数。可能吗?Javascript 中是否有另一种“更严格”的技术来访问对象属性?

4

5 回答 5

3

一种不需要我编写包装函数的解决方案,每次我想访问对象的成员时都会使用该函数。可能吗?Javascript 中是否有另一种“更严格”的技术来访问对象属性?

不,您可以使用 a Proxy,它旨在完全按照您的意愿行事。然而,它只是一个草稿,目前仅在 Firefox 的 Javascript 1.8.5 (FF18+) 中支持。

没有其他可能为所有属性访问提供隐式 getter 函数。您将必须明确编码。

于 2013-06-21T05:57:48.457 回答
2

你不能...

如果你想非常小心,hasOwnProperty会让你检查是否定义了属性。

function GetSafe(obj, propertyName)
{
   if (obj.hasOwnProperty(propertyName)) return obj[propertyName];
   return "Unknown property:"+ propertyName; // throw or some other error reporting.
}
var obj = {'myKey': 'myVal'};
alert(GetSafe(obj, "myKey"));
alert(GetSafe(obj, "myKye"));
于 2013-06-21T05:47:03.527 回答
1

尝试这个:

function invalidKeyException(message) {
   this.message = message;
   this.name = "invalidKeyException";
}

var obj = {'myKey': 'myVal'},
val = obj.myKye;
if (val == undefined)
    throw new invalidKeyException("Key does not exist.");

JSFiddle:http: //jsfiddle.net/r2MM4/

(看控制台)

于 2013-06-21T05:45:22.773 回答
0

您可以尝试以下方法:

1)使用typeof

try {
    var obj = {'myKey': 'myVal'}, val;

   if(typeof (obj.myKye) === 'undefined')
   {
      var e = new NotImplementedError("NotImplementedError Your_message");
      throw e;
   } 
   else
   {
     val = obj.myKye;
   }    
    alert(val);
   }
catch(e) 
  {
    alert(e);
  }

2)使用obj.hasOwnProperty(prop)

try {
    var obj = {'myKey': 'myVal'}, val;

   if(obj.hasOwnProperty(myKye))
   {
     val = obj.myKye;
   } 
   else
   {
      throw 'Property undefined';
   }
    alert(val);
   }
catch(e) 
  {
    alert(e);
  }
于 2013-06-21T05:50:04.733 回答
-1

您可以使用try-catch,hasOwnProperty并创建一个ReferenceError

var obj = {
        'myKey': 'myVal'
}, val;

try {
    if(obj.hasOwnProperty(myKye))
    {
        val = obj.myKye;
        alert(val);
    }

    else{
        var ex =  new ReferenceError()
    }
}
catch(ex) {
    alert(ex);
}

测试链接

更新:

obj.myKye返回undefined并且不抛出异常,因为,

那是JS语言规范。

对象为未定义的属性名称返回未定义,但未定义的变量引用引发错误

于 2013-06-21T05:37:40.493 回答