我的Array子类没有调用超级构造函数

时间:2012-06-15 20:25:48

标签: javascript inheritance constructor prototype

根据this answer我想创建自己的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

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

1 个答案:

答案 0 :(得分: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 setter / getter)。如果您需要灵感,请查看this answer