我的数组子类不调用超构造函数



根据这个答案,我想创建我自己的Array子类

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

按预期工作,方法调用有效,但构造函数不链接到 Array。

// 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

如果我用普通Array替换QArray,此测试通过。不知何故Array这似乎是一个特例。(我在 Rhino 1.6 中运行它,这是 Javascript 1.5。如何修复数组的自定义子类?

由于您的方法已经继承了数组方法,因此您可以使用修改键的数组方法,例如 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 setter/getter)。如果你需要灵感,看看这个答案。

最新更新