JavaScriptでプロトタイプオブジェクトはjQueryのを壊しますか?
-
11-09-2019 - |
質問
私は.js
とObject
プロトタイプに追加された機能のいくつかはかなり平凡な一般的なタスクの並べ替えを持っている私のページへの単純なArray
ファイルを追加しています。
試行錯誤が、私は任意の機能を追加することObject.prototype
することを考え出した、どんなにそれが名前だか何それがないことのjQueryでJavascriptエラーが発生します:
犯人?
Object.prototype.foo = function() {
/*do nothing and break jQuery*/
};
私がATTRで、jquery-1.3.2.js
のライン1056得ているエラー:関数{}宣言
/*Object doesn't support this property or method*/
name = name.replace(/-([a-z])/ig, function(all, letter) {
return letter.toUpperCase();
});
どうやらG.replaceは未定義になります。
それが何かは、私はちょうどプロトタイピングの周り私の頭をラップではないよがあることは明白だが、私はそれが何であるかを把握するために無残失敗しています。
明確にするために、私は回避策を探していないよ、私が処理したが...私が探しているのなぜ?のへの答えです。なぜ、このコードのビットを破るObject.prototype
する機能を追加しますか?
他のヒント
それは単にのために台無しの場合なら...ループで、あなたはそれが列挙することなく、あなたのFNを追加するためにObject.definePropertyを使用することはできません?
ですからます:
Object.defineProperty(Object.prototype, "foo", {
value: function() {
// do stuff
},
enumerable : false
});
私のために働くようです。これはまだ悪いフォームと見なされるでしょうか?
私は、需要の注意をObject.prototype
するために何かを追加し、同意し、避けるべきです。
このオブジェクトに追加し、必要に応じて、call
又はapply
でそれにアクセスします。
たとえばます:
Object.foo = function () { return this.whatever()}
するとによってオブジェクトにそれを呼び出します:
Object.foo.call(Objname); // this invokes the function as though it were a
// method of Objname. That is, its like Objname.foo()
楽しみのために、あなたは以下を追加することができます(はい、私は...その少し危険を知っている):
Function.using = Function.call; // syntactic sugar
今、あなたはObject.foo.using(Objname)
を書くことができ、それが一文に含まのように読みます。
しかし、原則として、大きなプロトタイプのいずれかを変更することから離れています。
私はこのように私のすべてのオブジェクトで「本物の」オブジェクト指向を実現することを望んだとして、この問題の周り私の頭を打ちます:
interface Object
{
GetType: () => string;
ToString: () => string;
GetHashcode: () => number;
Equals: (obj: any) => boolean;
}
Object.prototypeはjQueryのを壊すので、、私はのDefinePropertyを利用するために、上記の解決策にデフォルト設定が、それは任意の引数を取りません。
良いニュースは、あなたがのDefinePropertyに侵入し、実際にパラメータを受け入れることができるということです。ここに私の実装では、次のとおりです。
Object.defineProperty(Object.prototype, "Equals",
{
value: function (obj: any)
{
return obj == null && this == null
? true
: obj != null && this == null
? false
: obj == null && this != null
? false
: this.GetHashcode() == obj.GetHashcode();
},
enumerable: false
});
この作品とjQueryと衝突しません。
私はのObject.prototype直接のjQueryを破るに機能を追加することを疑います。
:ちょうどあなたが世界的に機能を追加しましたし、それを反復処理の結果は予測できないことができますので、必ずあなたのサイトを通じてあなたが持っているそれぞれにfor..inループは、hasOwnPropertyをチェックに包まれて作りますObject.prototype.foo = function() {};
var myObject = {m1: "one", m2: "two" };
for(var i in myObject) { if(myObject.hasOwnProperty(i)) {
// Do stuff... but not to Object.prototype.foo
}}