質問

私は.jsObjectプロトタイプに追加された機能のいくつかはかなり平凡な一般的なタスクの並べ替えを持っている私のページへの単純な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する機能を追加しますか?

役に立ちましたか?

解決

あなたはObject.prototypeを拡張することはありません。これは、jQueryのを壊すよりもはるかに多くを行います。それは完全にJavaScriptを「オブジェクトとして、ハッシュテーブル」機能を破ります。それをしないでください。

あなたはジョンResig氏に尋ねることができ、彼はあなたに同じことをする rel="noreferrer">

他のヒント

それは単にのために台無しの場合なら...ループで、あなたはそれが列挙することなく、あなたの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
}}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top