2017-02-14 6 views
0

オブジェクトのプロトタイプに列挙可能な関数を追加するたびに、タイプエラーが発生します。オブジェクトにプロトタイプに列挙可能な関数を追加するときに捕捉できないタイプエラー

jquery-1.10.2.js:2451 Uncaught TypeError: matchExpr[type].exec is not a function 
    at tokenize (jquery-1.10.2.js:2451) 
    at Function.Sizzle [as find] (jquery-1.10.2.js:1269) 
    at init.find (jquery-1.10.2.js:5744) 
    at change-project-controller.js:4 
    at change-project-controller.js:255 
tokenize @ jquery-1.10.2.js:2451 
Sizzle @ jquery-1.10.2.js:1269 
find @ jquery-1.10.2.js:5744 
(anonymous) @ change-project-controller.js:4 
(anonymous) @ change-project-controller.js:255 

jquery-1.10.2.js:2451 Uncaught TypeError: matchExpr[type].exec is not a function 
    at tokenize (jquery-1.10.2.js:2451) 
    at Function.Sizzle [as find] (jquery-1.10.2.js:1269) 
    at init.find (jquery-1.10.2.js:5744) 
    at filter-by-registrant-controller.js:10 
    at filter-by-registrant-controller.js:179 
tokenize @ jquery-1.10.2.js:2451 
Sizzle @ jquery-1.10.2.js:1269 
find @ jquery-1.10.2.js:5744 
(anonymous) @ filter-by-registrant-controller.js:10 
(anonymous) @ filter-by-registrant-controller.js:179 

jquery-1.10.2.js:2451 Uncaught TypeError: matchExpr[type].exec is not a function 
    at tokenize (jquery-1.10.2.js:2451) 
    at Function.Sizzle [as find] (jquery-1.10.2.js:1269) 
    at init.find (jquery-1.10.2.js:5744) 
    at registrations-controller.js:6 
    at registrations-controller.js:412 
tokenize @ jquery-1.10.2.js:2451 
Sizzle @ jquery-1.10.2.js:1269 
find @ jquery-1.10.2.js:5744 
(anonymous) @ registrations-controller.js:6 
(anonymous) @ registrations-controller.js:412 

Index:290 Uncaught TypeError: Cannot read property 'registerFilter' of undefined 
    at Index:290 
(anonymous) @ Index:290 

最後の4つのエラーは、jQueryとは関係がないことに注意してください。

これは、エラーが発生する原因となるコードです:

Object.defineProperty(Object.prototype, "select", { 

    enumerable: true, 
    value: function() { 

     return "hello world"; 

    } 

}); 

私はこのように、非可算としての機能を追加した場合、私はエラーを取得しない:

Object.defineProperty(Object.prototype, "select", { 

    enumerable: false, 
    value: function() { 

     return "hello world"; 

    } 

}); 

ていることに注意してください唯一の違いは、列挙可能なメンバーがfalseに設定されていることです。また、ObjectではなくArrayに追加されるenumerable関数を変更しても、コードは正常に動作します。

私が取り組んでいるプロジェクトは私のものではありませんので、私はそれを共有することはできません。jsfiddleまたは単純なHTMLファイルでエラーを再現できませんでした。

答えて

1

Objectのプロトタイプに列挙可能な関数を追加するたびに、タイプエラーが発生します。

このようにしないでください。あなたが見つけたように、それを行うことで、無防備なコードがたくさん壊れてしまいます。デフォルトの状態は、空白のオブジェクトに列挙可能なプロパティがないことです。例:

var o = {}; 
 
for (var name in o) { 
 
    console.log("This line never runs in a reasonable world."); 
 
} 
 
console.log("End");

Object.prototypeに列挙プロパティを追加することにより、あなたはそれを破る:Object.prototypeに物事を追加

Object.prototype.foo = function() { }; 
 
var o = {}; 
 
for (var name in o) { 
 
    console.log("I wasn't expecting to find: " + name); 
 
} 
 
console.log("End");

はほとんど良いアイデアになることはありません。 数値をに追加すると、は常にとなり、Bad Idea™になります。すべての最新のブラウザではdefinePropertyがサポートされています。したがって、 augment Object.prototypeでなければなりません。ただし、非列挙型のObject.prototypeプロパティでも非互換性を導入するのは簡単です。サポートしていない古いブラウザをサポートする必要がある場合は、Object.prototypeのままにする必要があります。

+0

私はあなたが何を意味するかを見て、私はそれを十分に尊重します。しかし、私は、なぜ私のregisterFilter関数が突然消えてしまうのかという問題に悩まされています。何か案が? –

+0

@RobinTheilade:私はそれを理解するのが怖いです。あなたが作成できなかったMCVEを持っていなければなりません。基本的には、上記の問題によってどこかで何かがうまくやっていて、それがノックオン効果を持っていて、あなたが見ているエラーを引き起こしています。確かに知る唯一の方法は、MCVEの制作を継続することです(その過程で、おそらくそれを理解するでしょう)。しかし、それは時間を費やすのに便利な方法ではありません。根本的には、ルートプロトタイプに列挙型を追加しないでください。 :-) –

関連する問題