简体   繁体   中英

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.

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.

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.

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] ) );
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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