错误propertyIsEnumerable上的消息属性是什么?

时间:2011-09-26 18:19:58

标签: javascript firefox google-chrome ecmascript-5

以下内容的正确结果是什么? ECMA标准是否指定了这一点?我目前的Chrome 14.0.835.186m认为false而Firefox 3.6.22认为是true

(new Error()).propertyIsEnumerable("message")

这更令人讨厌,因为Chrome过去常常会考虑true,现在我因为这种变化而破坏了代码。

3 个答案:

答案 0 :(得分:2)

我无法在ECMAScript 5规范中找到所需的方式(并不意味着它不存在),但它看起来似乎是可配置的,所以你可以这样做:

Object.defineProperty( Error.prototype,'message',{enumerable:true});

console.log( Error.prototype.propertyIsEnumerable('message') ); // true

或者这个:

var err = new Error('a message');

Object.defineProperty( err,'message',{enumerable:true});

console.log( err.propertyIsEnumerable("message") );  // true

答案 1 :(得分:1)

对于'内置插件',

propertyIsEnumerable不会返回true,如:

Error.prototype.messageArray.prototype.length

可枚举属性是直接在对象上设置的属性,如ECMA 262的15.2.4.7节所定义,可以下载here

例如:

> var arr = [];
> arr.propertyIsEnumerable("length")
false
> arr.kudos = 55;
55
> arr.propertyIsEnumerable("kudos")
true
> var err = new Error("some message");
> err.propertyIsEnumerable("message")
false
> err.Something = { };
{}
> err.propertyIsEnumerable("Something")
true

propertyIsEnumerable方法用于确定for..in循环中可以使用的内容。

例如:

> for(var key in arr) { console.log(key); }
kudos
> for(var key in err) { console.log(key); }
Something

您使用的是propertyIsEnumerable而不是hasOwnProperty吗?

> err.hasOwnProperty("message")
true
> arr.hasOwnProperty("length")
true

以下是其他一些示例:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/propertyIsEnumerable

我之所以认为这些浏览器之所以能够正常工作,是因为这些浏览器正在逐步提升ECMAScript 5的合规性。

编辑:

如果您需要所有属性,包括非可枚举属性,则可以使用Object.getOwnPropertyNames(obj)。这是一个将非可枚举属性复制到另一个对象的示例。

> var err = new Error("Some message");
> var copy = { };
> Object.getOwnPropertyNames(err).forEach(function(key) {
... copy[key] = err[key];
... });
> copy
{ stack: 'Error: Some message\n    at repl:1:11\n    at Interface.<anonymous> (r
epl.js:168:22)\n    at Interface.emit (events.js:67:17)\n    at Interface._onLin
e (readline.js:153:10)\n    at Interface._line (readline.js:408:8)\n    at Inter
face._ttyWrite (readline.js:585:14)\n    at ReadStream.<anonymous> (readline.js:
73:12)\n    at ReadStream.emit (events.js:70:17)\n    at onKeypress (tty_win32.j
s:46:10)',
  message: 'Some message',
  arguments: undefined,
  type: undefined }
> copy instanceof Error
false
> err instanceof Error
true

见这里:https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects#section_2

答案 2 :(得分:0)

正确的结果是错误的,因为message的{​​{1}}属性是继承的(我想从原型中)。