根据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子类?
答案 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。