Свойство сообщения об ошибке propertyIsEnumerable? - PullRequest
2 голосов
/ 26 сентября 2011

Каков правильный результат следующего?Какой-либо из стандартов ECMA определяет это?Мой текущий Chrome 14.0.835.186m думает false, а Firefox 3.6.22 думает true.

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

Это очень раздражает, потому что в Chrome раньше тоже думали true, и теперь я нарушил код из-за этого изменения.

Ответы [ 3 ]

2 голосов
/ 26 сентября 2011

Я не могу найти в спецификации 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 голос
/ 26 сентября 2011

propertyIsEnumerable не возвращает true для «встроенных модулей», таких как:

Error.prototype.message или Array.prototype.length

Перечислимыми свойствами являются те, которые установлены непосредственно в самом объекте, как определенов разделе 15.2.4.7 ECMA 262, который можно загрузить здесь

Например:

> 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

0 голосов
/ 26 сентября 2011

Правильный результат - ложь, потому что message свойство Error наследуется (я думаю, из прототипа).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...