2

次の正しい結果はどれですか? これを指定している ECMA 規格はありますか? 私の現在の Chrome 14.0.835.186m は考えfalse、Firefox 3.6.22 は考えtrueます。

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

trueChromeも同様に考えていたため、これは非常に面倒であり、この変更によりコードが壊れてしまいました。

4

3 に答える 3

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
于 2011-09-26T18:31:24.663 に答える
1

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

于 2011-09-26T18:45:47.970 に答える
0

messageのプロパティErrorが継承されているため(プロトタイプからだと思います)、正しい結果は false です。

于 2011-09-26T18:31:02.310 に答える