8
Object.prototype.doSomething = function(p) {
    this.innerHTML = "<em>bar</em>";
    this.style.color = "#f00";
    alert(p);
};

document.getElementById("foo").doSomething("Hello World");

<div id="foo"><strong>foo</strong></div>

上記のコードは正常に機能します。

しかし、私はこれをどこかで見たことを覚えていますDo not mess with native Object.。まあ、そのようなものです。

では、オブジェクトにプロトタイプ関数を定義しても大丈夫ですか?これをしてはいけない理由はありますか?

4

4 に答える 4

7

に追加する唯一の安全な方法Object.prototypeは、ES5メソッドを使用して列挙できないプロパティObject.definePropertyを作成することです。

Object.defineProperty(Object.prototype, 'doSomething', {
    value: function(p) { ... },
    enumerable: false,  // actually the default
});

これにより、表示した場合に新しいプロパティが表示されなくなりますfor (key in object)

以前のバージョンのECMAScript/JavaScriptには列挙できないプロパティが存在しなかったため、この関数を確実にシムすることはできないことに注意してください。

いずれにせよ、メソッドがHTMLページ要素にのみ適用される場合は、にElement.prototypeではなくにこれを追加する方がよいでしょうObject.prototype。ただし、これを行うと、古い(IE)ブラウザーが文句を言う場合があります。

于 2013-03-25T16:59:00.267 に答える
1

一般的には良い考えではありません。この関数は、オブジェクトプロトタイプ(多くあります)を使用するアプリ内のすべてで使用できるようになり、オブジェクトプロトタイプを列挙する関数に表示されます。

より良いオプションは、別のプロトタイプを定義することです。

function MyObject {
    ...
}

MyObject.prototype.doSomething = function() {
    ...
}

var myObj = new MyObject();
于 2013-03-25T16:59:21.963 に答える
1

オブジェクトのプロトタイプに何かを追加すると、を使用して優れたオブジェクト反復機能が失われます。for p in objこれは、追加した列挙可能なプロパティがすべてのオブジェクトでも反復されるためです。

例えば:

Object.prototype.doSomething = function(p) {
    this.innerHTML = "<em>bar</em>";
    this.style.color = "#f00";
    alert(p);
};

for (p in {foo:"bar"}){
    console.log(p);
}

//foo
//doSomething

予期せず、ログに記録されることもありdoSomethingます。これを修正するにはhasOwnproperty、オブジェクトを反復処理するときにチェックを追加する必要がありますが、ここでのリスクは、プレーンオブジェクトがリテラルで指定されたもの以外のプロパティを持つことを期待しない他のコードを壊す可能性があることです。

于 2013-03-25T16:59:51.677 に答える
0

別のオプションは、オブジェクトプロトタイプメソッドとしてではなく定義されたメソッドを呼び出すことです-

function doSomething(p) {
    this.innerHTML = "<em>"+p+"</em>";
    this.style.color = "#f00";
    alert(p);
};

//

doSomething.call(document.getElementById("foo"),"Hello World");
于 2013-03-25T17:09:35.837 に答える