我希望能够将本机对象的API密钥/类型打印到控制台,但我得到Uncaught TypeError:非法调用(...)错误。
我认为问题是因为某些属性是使用getter和setter创建的,当运行typeof obj [keys [i]]时,它会调用该函数脱离上下文。
function keys_vals( obj ) {
var keys = Object.keys( obj );
for ( var i = 0; i < keys.length; i++ ) {
console.log( keys[i], typeof obj[keys[i]] );
}
}
样本运行
key_vals(Node.prototype)
---------------------------
ELEMENT_NODE 1 number
ATTRIBUTE_NODE 2 number
TEXT_NODE 3 number
CDATA_SECTION_NODE 4 number
ENTITY_REFERENCE_NODE 5 number
ENTITY_NODE 6 number
PROCESSING_INSTRUCTION_NODE 7 number
COMMENT_NODE 8 number
DOCUMENT_NODE 9 number
DOCUMENT_TYPE_NODE 10 number
DOCUMENT_FRAGMENT_NODE 11 number
NOTATION_NODE 12 number
DOCUMENT_POSITION_DISCONNECTED 1 number
DOCUMENT_POSITION_PRECEDING 2 number
DOCUMENT_POSITION_FOLLOWING 4 number
DOCUMENT_POSITION_CONTAINS 8 number
DOCUMENT_POSITION_CONTAINED_BY 16 number
DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC 32 number
Uncaught TypeError: Illegal invocation(…)
答案 0 :(得分:0)
正如Arun P Johny所说,这将打印出API,问题确实是因为在使用getter和setter函数设置属性时,typeof obj [keys [i]]会将这些函数称为脱离上下文。
function keys_vals( obj ) {
var keys = Object.keys( obj );
for ( var i = 0; i < keys.length; i++ ) {
try {
console.log( keys[i], obj[keys[i]], typeof obj[keys[i]] );
} catch ( e ) {
console.log( keys[i], Object.getOwnPropertyDescriptor( obj, keys[i] ) );
}
}
}