次の正しい結果はどれですか? これを指定している ECMA 規格はありますか? 私の現在の Chrome 14.0.835.186m は考えfalse
、Firefox 3.6.22 は考えtrue
ます。
(new Error()).propertyIsEnumerable("message")
true
Chromeも同様に考えていたため、これは非常に面倒であり、この変更によりコードが壊れてしまいました。
次の正しい結果はどれですか? これを指定している ECMA 規格はありますか? 私の現在の Chrome 14.0.835.186m は考えfalse
、Firefox 3.6.22 は考えtrue
ます。
(new Error()).propertyIsEnumerable("message")
true
Chromeも同様に考えていたため、これは非常に面倒であり、この変更によりコードが壊れてしまいました。
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
propertyIsEnumerable
次のような「組み込み」に対して true を返しません。
Error.prototype.message
またArray.prototype.length
列挙可能なプロパティは、ECMA 262 のセクション 15.2.4.7 で定義されているように、オブジェクト自体に直接設定されるプロパティであり、ここからダウンロードできます。
例えば:
> 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
message
のプロパティError
が継承されているため(プロトタイプからだと思います)、正しい結果は false です。