33

Array.pushpushを使用するとコールバックメソッドがトリガーされ、通常の配列関数が実行されるようにメソッドを拡張しようとしています。

これを行う方法はよくわかりませんが、これまでに失敗したコードをいくつか示します。

arr = [];
arr.push = function(data){

    //callback method goes here

    this = Array.push(data);
    return this.length;
}

arr.push('test');
4

6 に答える 6

75

pushでは複数の要素をプッシュできるため、以下の引数変数を使用して実際のプッシュ メソッドにすべての引数を持たせます。

この解決策はarr変数にのみ影響します。

arr.push = function () {
    //Do what you want here...
    return Array.prototype.push.apply(this, arguments);
}

このソリューションは、すべてのアレイに影響します。そうすることはお勧めしません。

Array.prototype.push = (function() {
    var original = Array.prototype.push;
    return function() {
        //Do what you want here.
        return original.apply(this, arguments);
    };
})();
于 2009-02-21T08:24:50.117 に答える
11

まず、サブクラスが必要ですArray:

ES6 ( https://kangax.github.io/compat-table/es6/ ):

class SortedArray extends Array {
    constructor(...args) {
        super(...args);
    }
    push() {
        return super.push(arguments);
    }
}

ES5 ( protoはほとんど非推奨ですが、現時点では唯一の解決策です):

function SortedArray() {
    var arr = [];
    arr.push.apply(arr, arguments);
    arr.__proto__ = SortedArray.prototype;
    return arr;
}
SortedArray.prototype = Object.create(Array.prototype);

SortedArray.prototype.push = function() {
    this.arr.push(arguments);
};
于 2016-10-10T19:20:40.110 に答える
6

あなたはこのようにすることができます:

arr = []
arr.push = function(data) {
  alert(data); //callback

  return Array.prototype.push.call(this, data);
}

電話がない状況にある場合は、次の解決策を選択することもできます。

arr.push = function(data) {
  alert(data); //callback
  
  //While unlikely, someone may be using "psh" to store something important
  //So we save it.
  var saved = this.psh;
  this.psh = Array.prototype.push;
  var ret = this.psh(data);
  this.psh = saved;
  return ret;
}

その方法を説明していますが、 pushをオーバーライドするのではなく、コールバックを実行して配列に対してpushを呼び出す別のメソッドを使用したほうがよい場合があります。予期しない副作用が発生する可能性があります。たとえば、pushはバラディック ( printfのように可変数の引数を取る) のように見え、上記を使用するとそれが壊れます。

この関数を適切にオーバーライドするには、_Arguments() と _ArgumentsLength() をいじる必要があります。このルートに反対することを強くお勧めします。

または、「引数」を使用することもできますが、それも機能します。ただし、このルートを使用しないことをお勧めします。

于 2009-02-21T08:20:18.193 に答える
6

Array.prototype.push は JavaScript 1.2 で導入されました。それは本当にこれと同じくらい簡単です:

Array.prototype.push = function() {
    for( var i = 0, l = arguments.length; i < l; i++ ) this[this.length] = arguments[i];
    return this.length;
};

その前にいつでも何かを追加できます。

于 2009-04-02T23:22:50.290 に答える