为了账号安全,请及时绑定邮箱和手机立即绑定

js中如何继承实现Array的子类?

js中如何继承实现Array的子类?

炎炎设计 2019-02-04 09:05:19
试想需要实现一个数组的子类ZeroArray,其构造函数接收一个长度参数n,自动初始化数组元素都为0。我试图继承原生的Array类型,成员变量通过apply()方法窃取,成员方法则通过原型链引用。代码如下:function ZeroArray(n) {    // 构造函数窃取     Array.apply(this);    // 自动塞入0元素     for (var i = 0; i < n; i++) {        this.push(0);     } }// 利用空函数作为过渡,ZeroArray原型的原型指向Array.prototype// 既建立原型链,又不影响Array.prototype本身,而且防止Array构造函数重复调用两次var F = function() {}; F.prototype = Array.prototype; ZeroArray.prototype = new F(); ZeroArray.prototype.constructor = ZeroArray;那么问题来了: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会不同?是不是因为Array本质上并不是Object?
查看完整描述

2 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

你提了个有意思的问题,只指出一点,但解决不了你的问题。

继承的话,下面这种写法更好。

function ZeroArray(n) {    // 自动塞入0元素
    for (var i = 0; i < n; i++) {        this.valueOf().push(0);
    }
}

ZeroArray.prototype = [];//但enumerable和configurable依旧变了console.log(Object.getOwnPropertyDescriptor([1,2,3], "length"))console.log(Object.getOwnPropertyDescriptor(new ZeroArray(3), "length"))


查看完整回答
反对 回复 2019-03-16
  • 2 回答
  • 0 关注
  • 836 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信