2013-03-25 7 views
7
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>ObjectでJavascriptのプロトタイプ関数を定義しても構いませんか?

上記のコードは正常に動作します。

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

したがって、のオブジェクトにプロトタイプ関数を定義してもよろしいですか?私がこれをしてはならない理由はありますか?

+0

は、他の人が消費することになるライブラリーでは、このですMETHOD-オブジェクトのプロトタイプとして定義される方法、ありますか?または、あなた自身のアプリケーションコードですか? –

+0

私は他の人が使っている小さなライブラリを書いています。下に示唆された答えとして、コードを書く人がいなくても、私はこれをしてはいけないと思います。 – user1643156

答えて

5

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ページ要素にのみ適用される場合は、Object.prototypeの代わりにElement.prototypeにこれを追加する方がよいでしょう。これを行うと、古いIE(Internet Explorer)のブラウザで不平を言うことがあります。

+0

['hasOwnProperty'](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/hasOwnProperty)ベストプラクティスはとにかく今でもありますか? –

+0

@RoatinMarthいいえ、IMHO' hasOwnProperty'はベストプラクティスです。 ES5ブラウザでは不要です。 'Object.prototype'で汚れているコードは、追放されるべきです。 jQueryでさえ 'hasOwnProperty'テストを省略し、それを乱用するコードを使用すると失敗することを明示的に述べています。 – Alnitak

+0

'以前のバージョンのJavascriptには列挙できないプロパティが存在しません。 'というバージョンは' previous'を意味しますか? – user1643156

1

一般的には良い考えではありません。その機能はのオブジェクトプロトタイプ(たくさんあります)を使用するアプリケーションで利用でき、Objectプロトを列挙する関数に表示されます。

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

function MyObject { 
    ... 
} 

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

var myObj = new MyObject(); 
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チェックを追加する必要がありますが、リテラルに指定されているプロパティ以外のプロパティをプレーンオブジェクトが持つことを期待しない他のコードを破る可能性があります。

+0

あなたが追加した_enumerable_プロパティから... – Alnitak

+0

@Alnitak更新、ありがとうございます。 –

0

別のオプションは、コールにない

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

//

doSomething.call(document.getElementById("foo"),"Hello World"); 
関連する問題