[英]Subclassing JavaScript arrays - constructor arguments not passing to array
我想子類化一個javascript數組並將構造函數參數傳遞給數組。 我有的是:
function SubArray(arguments) {
Array.apply(this, arguments);
}
SubArray.prototype = Array.prototype;
Test並不表示參數正在傳遞給Array
var x = new SubArray("One", "Two", "Three");
// Object[]
// x.length = 0
而當我使用數組執行此操作時,我得到了這個
var x = new Array("One", "Two", "Three");
// Object["One", "Two", "Three"]
// x.length = 3
我究竟做錯了什么?
在ES6中,您可以使用class
語法擴展Array
class SubArray extends Array {
constructor() {
super(...arguments);
}
first() {
return this[0];
}
}
長度將按預期工作
var sa = new SubArray('foo', 'bar');
sa[2] = 'baz';
sa.length; // 3
sa.first(); // "foo"
sa instanceof SubArray; // true
直到並包括ES5,沒有辦法以通常的構造函數原型方式干凈地擴展Array
而不會丟失功能,而是必須向Array實例添加屬性
function SubArray() {
var arr = Array.apply(null, arguments);
arr.first = function () {return this[0];};
return arr;
}
使用它不再需要new
因為從函數返回Object ,而instanceof
將無法確定SubArray 。
var sa = SubArray('foo', 'bar');
sa[2] = 'baz';
sa.length; // 3
sa.first(); // "foo"
sa instanceof SubArray; // false -- this gets broken
在行為比速度更重要的ES5環境中,您可以使用Object.setPrototypeOf
強制原型鏈(請參閱MDN警告) ,這是“有點黑客” ,看起來像
function SubArray() {
var arr = Array.apply(null, arguments);
Object.setPrototypeOf(arr, SubArray.prototype);
return arr;
}
SubArray.prototype = Object.create(Array.prototype);
SubArray.prototype.first = function () {return this[0];};
同樣,不再需要new
但這次實例的行為與正常擴展時的預期完全相同。
var sa = SubArray('foo', 'bar');
sa[2] = 'baz';
sa.length; // 3
sa.first(); // "foo"
sa instanceof SubArray; // true
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.