0

この回答によると、独自のサブクラスを作成したいArray

QArray = function() {
    Array.apply(this, arguments);
};
QArray.prototype = new Array();
QArray.prototype.constructor = QArray;

これは期待どおりに機能し、メソッドの呼び出しは機能しますが、コンストラクターは配列にチェーンしません。

// test constructor chaining
q = new QArray('1', '2', '3');
assert.equals('1', q[0]);      // => undefined
assert.equals(3, q.length);    // => 0
q = new QArray(10);
assert.equals(10, q.length);   // => 0

QArrayプレーンに置き換えると、このテストに合格しますArray。なんとなくArray特殊なケースのようです。(Javascript 1.5 である Rhino 1.6 でこれを実行します。) Array のカスタム サブクラスを修正するにはどうすればよいですか?

4

1 に答える 1

1

メソッドはすでに配列メソッドを継承しているため、次のようなキーを変更する配列メソッドを使用できますArray.prototype.push

QArray = function() {
    if (arguments.length == 1) this.length = arguments[0]; // Array constructor
    else this.push.apply(this, arguments);
};
QArray.prototype = new Array();
QArray.prototype.constructor = QArray;

q = new QArray('1', '2', '3');   // => [1,2,3]
assert.equals('1', q[0]);        // => true
assert.equals(3, q.length);      // => true
q = new QArray(10);              // => [,,,,,,,,,]
assert.equals(10, q.length);     // => true
q instanceof QArray;             // => true
q instanceof Array;              // => true

私はかつて、真の配列 (lengthセッター/ゲッターを含む) のように動作するカスタム配列実装を作成したことがあります。インスピレーションが必要な場合は、この回答をご覧ください。

于 2012-06-15T20:38:25.133 に答える