簡體   English   中英

子類化JavaScript數組 - 不傳遞給數組的構造函數參數

[英]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

在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

直到並包括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(慢)

在行為比速度更重要的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM