以下内容的正确结果是什么? ECMA标准是否指定了这一点?我目前的Chrome 14.0.835.186m认为false
而Firefox 3.6.22认为是true
。
(new Error()).propertyIsEnumerable("message")
这更令人讨厌,因为Chrome过去常常会考虑true
,现在我因为这种变化而破坏了代码。
答案 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.message
或Array.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}}属性是继承的(我想从原型中)。