37

私は自分のページに単純なファイルを追加しました。このファイルには、およびプロトタイプ.jsに追加された、非常にありふれた一般的なタスクの種類の関数が含まれています。ObjectArray

試行錯誤の結果、関数を に追加するとObject.prototype、その名前や機能に関係なく、jQuery で Javascript エラーが発生することがわかりました。

犯人?

Object.prototype.foo = function() {
    /*do nothing and break jQuery*/
};

jquery-1.3.2.jsattr:function { } 宣言で の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このコードを壊す関数を追加するのはなぜですか?

4

5 に答える 5

47

for...in ループを台無しにするだけの場合は、Object.defineProperty を使用して、列挙可能にせずに fn を追加できませんか?

そう:

Object.defineProperty(Object.prototype, "foo", { 
    value: function() {
        // do stuff
    },
    enumerable : false
});

私にはうまくいくようです。これはまだ悪いフォームと見なされますか?

于 2011-05-04T23:20:35.623 に答える
21

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

あなたはジョン・レシグに尋ねることができます、そして彼はあなたに同じことを言うでしょう。

于 2009-12-01T17:14:04.813 に答える
5

Object.prototypeに何かを追加することは注意が必要であり、避けるべきであることに同意します。次のような他の解決策を探してください。

それを Object に追加し、必要に応じて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)、文章のように読み上げられます。

ただし、原則として、大きなプロトタイプの変更は避けてください。

于 2010-03-13T07:44:43.603 に答える
2

次のように、すべてのオブジェクトに「実際の」オブジェクト指向を実装したかったので、この問題に頭を悩ませました。

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 と競合しません。

于 2016-02-24T12:43:54.077 に答える
-1

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
}}
于 2009-12-01T17:01:32.797 に答える