2016-06-16 11 views
1

ネイティブオブジェクトのAPIキー/タイプをコンソールに出力できますが、Uncaught TypeError:Illegal invocation(...)エラーが発生します。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(…) 
+3

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])); } } } 
。 for(var i = 0; i

+0

を引き起こすキーを与えますあなたのケースでは、NodeType以外のインスタンスがエラーをスローします。 –

答えて

0

アルンPジョニーはこれがAPIをプリントアウトします示唆したように、問題は確かにあるので、ゲッターとセッターの機能を持つプロパティを設定する際のtypeof OBJ [キー[I]]文脈からそれらの機能を呼び出す。ただ `関数key_vals(OBJ){ VARキー= Object.keys(OBJ)のような方法を増強

+0

'typeof obj [keys [i]]'は関数を呼び出さないのですか? – Bergi

+0

@Bergi setter/getter関数を使ってプロパティを設定すると呼び出され、返されるのはtypeofを使用する場合です – ericsicons

+0

はい、なぜゲッターが '不正な呼び出し 'エラーを投げるのでしょうか?それはインストールされている 'obj'で呼び出され、間違っていることはあまりありません。いずれにしても、 'typeof'はそれとは何の関係もありません。 – Bergi

関連する問題