0

すべての配列のプロパティを簡単な関数で拡張したい(宿題用です)

Array.prototype.remove=(function(value){
var i;
var cleanedArray = new Array();
for(i= 0;i<this.length;i++)
{
    if(value !== this[i])
    {
        cleanedArray.push(this[i]);
    }
}

 this.length = cleanedArray.length;
 for(i=0;i<this.length;i++)
 {
     this[i] = cleanedArray[i];
 } })();

 var simpleArray = new Array(3,5,6,7,8,1,1,1,1,1,1,1);
 simpleArray.remove(1); console.log(simpleArray);

しかし、コンソールにエラーが表示されます。誰か助けてもらえますか?

エラー :

Uncaught TypeError: Property 'remove' of object [object Array] is not a function 
4

1 に答える 1

2

関数を宣言するには、これらの括弧は必要なく、呼び出す必要もありません。

次のように宣言できます。

  Array.prototype.remove=function(value){ // <== no opening parenthesis before function
     var i;
     var cleanedArray = new Array();
     for(i= 0;i<this.length;i++) {
        if(value !== this[i])
        {
            cleanedArray.push(this[i]);
        }
     }
     this.length = cleanedArray.length;
     for(i=0;i<this.length;i++) {
         this[i] = cleanedArray[i];
     } 
  }; // <== simply the end of the function declaration

IIFEと混同しているように見えますが、ここではその構造は必要ありません。

関数を列挙できないようにしたい場合は、Object.definePropertyを使用して行うことができます。

Object.defineProperty(Array.prototype, "remove", {
    enumerable: false, // not really necessary, that's implicitly false
    value: function(value) {
        var i;
         var cleanedArray = new Array();
         for(i= 0;i<this.length;i++) {
            if(value !== this[i])
            {
                cleanedArray.push(this[i]);
            }
         }
         this.length = cleanedArray.length;
         for(i=0;i<this.length;i++) {
             this[i] = cleanedArray[i];
         } 
    }
});

デモンストレーション

于 2013-03-28T12:58:59.203 に答える