简体   繁体   English

未捕获的TypeError:非法调用(...)循环遍历本机对象时

[英]Uncaught TypeError: Illegal invocation(…) When looping through native objects

I would like to be able to print out the a native object's API key/type to the console but I get Uncaught TypeError: Illegal invocation(…) error. 我希望能够将本机对象的API密钥/类型打印到控制台,但我得到Uncaught TypeError:非法调用(...)错误。

I think the issue is because some of the properties are created using getters and setters and when running typeof obj[keys[i]] it calls the function out of context. 我认为问题是因为一些属性是使用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]] );
    }
}

sample run 样品运行

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(…)

As Arun P Johny suggested this will print out the API, the issue is indeed because when setting properties with getters and setters functions typeof obj[keys[i]] calls those function out of context. 正如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] ) );
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM