You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中继承Array并覆写length的getter和setter?

修复JavaScript继承Array时覆写length访问器的问题

问题原因

Array的length是实例自身的特殊访问器属性,并非继承自原型链。你在子类类体中定义的get length和set length会被挂载到MyArray.prototype上,而实例自身的length属性优先级更高,所以不会触发原型上的访问器逻辑。

修复方案

方案一:在构造函数中重新定义实例的length访问器

直接在实例对象上覆盖原有的length属性,替换为自定义的访问器:

class MyArray extends Array {
  constructor(...args) {
    super(...args);
    
    Object.defineProperty(this, 'length', {
      get: () => {
        console.log('length getter');
        return super.length;
      },
      set: (value) => {
        console.log('length setter');
        super.length = value;
      },
      configurable: true,
      enumerable: true
    });
  }
}

const arr = new MyArray();
arr.length = 1; // 输出:length setter
console.log(arr.length); // 输出:length getter 随后输出1

方案二:使用Proxy拦截属性读写

通过Proxy包装实例,拦截所有属性的读写操作,针对length执行自定义逻辑:

class MyArray extends Array {
  constructor(...args) {
    super(...args);
    return new Proxy(this, {
      get(target, prop) {
        if (prop === 'length') {
          console.log('length getter');
        }
        return Reflect.get(target, prop);
      },
      set(target, prop, value) {
        if (prop === 'length') {
          console.log('length setter');
        }
        return Reflect.set(target, prop, value);
      }
    });
  }
}

const arr = new MyArray();
arr.length = 1; // 输出:length setter
console.log(arr.length); // 输出:length getter 随后输出1

内容的提问来源于stack exchange,提问作者dvv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 11:28:25