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