2

私はそれを使用する必要がある多くの機能的なメソッドを持っています、そして私はそれをJavaScript開発者と共有するためにこのメソッドでライブラリを公開する必要がありますそれは非常に役立ちますそれで例えば私は名前の付いたメソッドを追加する必要がありduplicates ますこのメソッドはECMAによって正式に公開されていないことがわかりますので、スクリプトを配置するのに最適なフォームがわかりません

1-

      Array.prototype.duplicate = function (){
        //script here its usefull to use `this` refer to the Array
       }

のようにそれを使用する

[1,2,2].duplicates();

2-2-

 var Ary = function(a){
      if(!(this instanceOf Ary))
          return new Ary(a)
      if(Object.prototype.toString.call(a) != '[object Array]')
          return new Error(a + 'is not an Array')
      else
      {
          for(var i =0 ; i<a.length; i++)
          {
             this.push(a[i]);
          }


      }
   }
Ary.prototype = new Array();
Ary.prototype.constructor = Ary; 

Ary.prototype.duplicates = function(){ 
   //script here its usefull to use `this` refer to the Array
};

のようにそれを使用する

Ary([1,2,2]).duplicates();

ECMAで正式に公開されていない場合は、プロトタイプを直接配列JavaScriptクラスに使用して機能を追加し、代わりに配列クラスから継承してそれを試してみるのが好きかどうかを知る必要があります。

またはそのOKはそれをプロトタイプ化しますか?

そしてその結果はどうですか

よろしく

4

2 に答える 2

6

duplicates独自のコードの場合、にメソッドを追加することは問題ありませんが、次のような配列をループするためにArray.prototype誤って使用するコード(独自のコードまたは使用しているもの)を使用した場合に発生する可能性があることに備える必要があります。for..in

for (var i in myArray) { // <==== Wrong without safeguards
}

...ある時点でi値を取得するため、オブジェクトとそのプロトタイプの列挙可能なプロパティをループするため、配列インデックスをループしません。正しく処理する場合は、配列で使用するのは問題ありません。SOに関するこの他の回答で詳しく説明します。"duplicates"for..infor..in

ES5対応の環境(IE8以前ではなく最新のブラウザー)でのみ作業する場合は、次のようにduplicatesviaを追加することでそれを回避できます。Object.defineProperty

Object.defineProperty(Array.prototype, "duplicates", {
    value: function() {
        // ...the code for 'duplicates' here
    }
});

そのように定義されたプロパティは列挙できないため、ループに表示されないため、配列for..inを正しく処理できないコードは影響を受けません。for..in

残念ながら、JavaScriptでは現在Array.prototype(2番目のオプション)から正しく派生することは不可能です。これArrayは、名前がすべて数字であるプロパティ(「配列インデックス」と呼ばれる)と特別なlengthプロパティの特別な処理があるためです。現在、これらのどちらも派生オブジェクトで正しく提供できません。これらの特別なプロパティの詳細については、ブログ記事A MythofArraysをご覧ください。

于 2013-01-26T15:09:06.780 に答える
2

原則として、ネイティブJavascriptオブジェクトのプロトタイプにモンキーパッチを適用しないでください。無害に見えるかもしれませんが、サイト/アプリケーションにサードパーティのコードを含めると、あらゆる種類の微妙なバグが発生する可能性があります。

Arrayインターネットには、構造を使用して配列を反復するバグのある誤ったコードがたくさんあるため、プロトタイプの変更は特に悪for ... inです。

見てみな:

for(var i in [1,2,3]) {
    console.log(i);
}

出力:

1
2
3

ただし、Arrayプロトタイプを次のように変更した場合:

Array.prototype.duplicates = function() { }

出力します

1
2
3
duplicates

自分の目で確かめてください

于 2013-01-26T15:10:49.433 に答える