試想需要實(shí)現(xiàn)一個(gè)數(shù)組的子類ZeroArray,其構(gòu)造函數(shù)接收一個(gè)長(zhǎng)度參數(shù)n,自動(dòng)初始化數(shù)組元素都為0。我試圖繼承原生的Array類型,成員變量通過(guò)apply()方法竊取,成員方法則通過(guò)原型鏈引用。代碼如下:function ZeroArray(n) { // 構(gòu)造函數(shù)竊取
Array.apply(this); // 自動(dòng)塞入0元素
for (var i = 0; i < n; i++) { this.push(0);
}
}// 利用空函數(shù)作為過(guò)渡,ZeroArray原型的原型指向Array.prototype// 既建立原型鏈,又不影響Array.prototype本身,而且防止Array構(gòu)造函數(shù)重復(fù)調(diào)用兩次var F = function() {};
F.prototype = Array.prototype;
ZeroArray.prototype = new F();
ZeroArray.prototype.constructor = ZeroArray;那么問(wèn)題來(lái)了:Object.getOwnPropertyDescriptor(new Array(), "length")// 輸出:Object {value: 0, writable: true, enumerable: false, configurable: false}
Object.getOwnPropertyDescriptor(new ZeroArray(3), "length")// 輸出:Object {value: 3, writable: true, enumerable: true, configurable: true}為什么兩者的length屬性enumerable/configurable會(huì)不同?是不是因?yàn)锳rray本質(zhì)上并不是Object?
js中如何繼承實(shí)現(xiàn)Array的子類?
炎炎設(shè)計(jì)
2019-02-04 09:05:19