9

コードをリファクタリング中です。私が持っているいくつかのユーティリティ関数を正確に実装する方法を決めるのに苦労しています。 具体的には、特定の関数が私の個人的な名前空間で使用したり、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. ユーティリティが自分の名前空間にある方がよい場合はどうすればわかりますか?
4

5 に答える 5

7
  1. 次の理由により、ほとんどありません。

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

    b/ 拡張関数は、in演算子によってプロパティとして反復されます。これは、hasOwnProperty (一般的には使用されません) によって除外されない限り、問題を引き起こします。

    これは、小規模な 1 つのスクリプトの作業に対して正当化できますが、そのコードをどこかで再利用しようとする人が絶対にいないことを 200% 確信している場合に限ります。このような場合、コードの複数のモジュールにまたがる機能にのみ使用してください。Trim() で String を拡張する - OK、prettyDate() で String を拡張する - 疑わしい、displayAsPageHeader() で Object を拡張する - 怖い。

  2. だから、ほとんどいつも。

于 2010-12-28T03:19:52.650 に答える
4

このビデオを見て:

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

于 2010-12-28T03:21:25.183 に答える
2

残念ながら、この質問には「正しい」答えはありません。よい議論ですが、ここで締め切られるのではないかと心配しています。ネイティブ オブジェクトを拡張する必要があるかどうかは主観的な議論であり、条件付きでそれを受け入れる場合は、「いつ?」に対する答えが返ってきます。は「依存」です。

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

ネイティブ オブジェクトの拡張で実際に問題になるのは、同じプロパティ名を持つ別の拡張機能を期待している可能性がある、またはfor(var i in obj)プロトタイプ チェーンの拡張機能を保護せずに不注意に使用している可能性がある、拡張機能と一緒に実行されている他のコードがある場合です。

于 2010-12-28T03:21:20.870 に答える
1

わかりました...私はこれの専門家ではありませんが、ほとんどありません! 名前空間内で行うことはより安全です。モジュールパターン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 || {};
于 2010-12-28T03:30:15.830 に答える
0

実行/ロードされるコードをどの程度制御できるかによって異なります。

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

  2. あなたが知らない/知らない場合、名前空間は不格好で冗長ではありますが、はるかに安全です。これは常により安全です。

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

于 2010-12-28T04:56:41.937 に答える