自分の名前空間をいつ使用する必要があり、いつネイティブJSオブジェクトを拡張する必要がありますか?

StackOverflow https://stackoverflow.com/questions/4543388

質問

私はコードをリファクタリングする過程にあります。私が持っているいくつかのユーティリティ関数を正確に実装する方法を決定するのに苦労しています。 具体的には, 、特定の関数が私の個人名空間またはJSオブジェクトを直接拡張する方が良い場合。

ネイティブJavaScriptオブジェクトを拡張する例

(これは適切な用語ですか?)。

String.prototype.prettyDate = function(){
  return (this.substr(5,2) + '/' + this.substr(8) + '/' + this.substr(0,4));
}
var myString = "2010-12-27";
//logs 12/27/2010
console.log(myString.prettyDate);

自分の名前空間を使用した例

var myNamespace = (function(){
   var my = {};
   my.prettyDate = function ( dateStr ){
      return (dateStr.substr(5,2) + '/' + dateStr.substr(8) + '/' + dateStr.substr(0,4));
   }
return my;
}());
var pretifiedDate = myNamespace.prettyDate('2010-12-27');
//logs 12/27/2010
console.log(pretifiedDate);

考慮すべき質問

  1. ユーティリティはいつネイティブJavaScriptオブジェクトに挿入されますか?
  2. ユーティリティが自分の名前空間にいる方が良いときはどうすればわかりますか?
役に立ちましたか?

解決

  1. ほとんど、

    A/他のライブラリとの競合の可能性

    b/拡張機能は、プロパティとして反復されます HasownPropertyによって除外されない限り問題を提起するオペレーター(一般的には使用されていません)

    小規模なワンスクリプトが機能する場合にこれを正当化することができますが、誰もそのコードをどこかに再利用しようとしないことを200%確信している場合のみです。このような場合、コードの複数のモジュールにまたがる機能にのみ使用します。 string()を使用して文字列を拡張し、choftydate()で文字列を拡張します - 疑わしい、displayaspageheader()を使用してオブジェクトを拡張します - 怖い。

  2. だから、ほとんど常に。

他のヒント

このビデオを見て:

John Resigは、ネイティブオブジェクトを拡張することは災害のレシピであると考えています。特に、フレームワークやアプリケーションが最初に意図されていた以上のものに成長する可能性が高い場合です。

残念ながら、この質問には「正しい」答えはありません。それは良い議論ですが、私はそれがここで閉鎖されるのではないかと心配しています。ネイティブオブジェクトをまったく拡張する必要があるかどうかは主観的な議論であり、「いつ?」への答えは条件付きで大丈夫であることを受け入れるならば、 「依存」です。

その使用と、それが他のコードと衝突するかどうかを制御している場合、すべきではない理由は本当にありません。非常に便利であり、コードサイズを大幅に削減する場合があります。

ネイティブオブジェクトを拡張することに本当の問題があるのは、拡張機能と一緒に他のコードを実行している場合です。 for(var i in obj) プロトタイプチェーンの拡張を防ぐことなく。

わかりました...私はこれに専門家ではありませんが、ほとんどありません!あなたがすることはあなたの名前空間の中でより安全です。モジュールパターンに従えば、すべてが正常に機能します http://www.yuiblog.com/blog/2007/06/12/module-pattern/

ただし、他の名前空間の上書きを避けることができる小さなトリックがあります。たとえば、

var myNamespace = {}; //my namespace, unsafely written

//Better solution
if(typeof myNamespace === 'undefined'){
    var myNamespace = {};
}

//Shorter solution
var myNamespace = myNamespace || {};

実行/ロードされているコードに対するコントロールの量に依存します。

  1. それがすべてあなたの管理下にある場合、組み込みのオブジェクトを拡張することに何の問題もありません、JavaScriptはこれを行うことができるように設計されています。これに関する唯一の問題は、2つのライブラリが同じ何かを変更した場合、予期しない問題を抱える可能性があることです。幸いなことに、あなたは自分自身にこれをしませんよね?

  2. あなたが知らない/知らないなら、名前空間は不格好で冗長ではあるがずっと安全です。これは常に安全です。

個人的には、私は過度に冗長なコードと名前空間が面白く見えるのが嫌いなので、2番目のオプションを好みます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top