尝试理解为什么 Javascript Error 对象的两个跨浏览器属性,即“name”和“message”,不能使用“for ... in”方法找到
// error code
...
}catch( err ){
// in FF this lists 3 properties for fileName, lineNumber and columnNumber...
// but NOT name or message!
for(var propertyName in err) {
$( '#diags' ).append( 'err property: ' + propertyName + ',
value: ' + err[ propertyName ] + '<br>' );
}
// this line prints fine:
$( '#diags' ).append( 'Error - name:' + err.name + ', message: ' + err.message + '<br>' );
}
编辑
我被问到名字和消息是什么。 这些是所有错误在任何浏览器中都具有的属性(是吗?)...所以在上面的代码中我添加了一行额外的代码,它显示这些“属性”或它们打印良好的任何内容
编辑2
根据马蒂的有用回答,我做了一些搜索。 这似乎回答了“检查”问题:是否可以获取对象的不可枚举继承属性名称?
A for...in 循环 不会迭代不可枚举的属性。
var e = new Error('a');
console.log(e.propertyIsEnumerable('name'));
console.log(e.propertyIsEnumerable('message'));
console.log(e.propertyIsEnumerable('fileName'));
console.log(e.propertyIsEnumerable('lineNumber'));
console.log(e.propertyIsEnumerable('columnNumber'));
for(var prop in e)
{
console.log(prop + ': ' + e[prop]);
}
输出
false
false
true
true
true
fileName: index.html
lineNumber: 25
columnNumber: 0
仅
name
和 message
为标准。通过解析 new Error().stack
. 返回的表达式可以得到错误的文件名和行号