根据这个答案,我想创建我自己的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)。如果你需要灵感,看看这个答案。