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

无ES类的纯函数式类型系统中,如何模拟父方法调用(非super())?

无类/纯函数式系统中模拟父方法调用的方案

一、纯函数式系统的核心思路

纯函数式场景下不用依赖原型或类的继承逻辑,核心是通过显式委托调用父级函数,把数据和行为分离,避免this隐式绑定,通过参数传递来复用父级逻辑。

二、不使用ES类和super的可选方案

针对你提供的代码场景,以下是几种可行的实现方式:

方案1:保存父构造函数挂载的实例方法

你的Queue在构造函数里直接把enqueue挂载到实例上,在AsyncQueue中可以先调用父构造函数初始化方法,再把父级方法存下来,之后在自己的方法里调用:

function Queue() {
  this.items = [];
  this.enqueue = function enqueue(item) {
    this.items.push(item);
    return item;
  }
}

function AsyncQueue() {
  Queue.call(this);
  // 保存父构造函数初始化的enqueue方法
  const parentEnqueue = this.enqueue;
  this.awaiters = new Queue();

  this.enqueue = function enqueue(item) {
    const awaiter = this.awaiters.dequeue();
    if (awaiter !== undefined) {
      setImmediate(() => {
        awaiter(item);
      });
    } else {
      // 调用父级方法并绑定当前实例的this
      parentEnqueue.call(this, item);
    }
    return item;
  }
}

AsyncQueue.prototype = Object.create(Queue.prototype);
AsyncQueue.prototype.constructor = AsyncQueue;

方案2:基于原型的显式调用

把方法定义在构造函数的原型上,直接通过父构造函数的原型调用对应方法,同样绑定当前实例的this:

function Queue() {
  this.items = [];
}

// 父级方法定义在原型上
Queue.prototype.enqueue = function enqueue(item) {
  this.items.push(item);
  return item;
}

function AsyncQueue() {
  Queue.call(this);
  this.awaiters = new Queue();
}

// 继承父级原型
AsyncQueue.prototype = Object.create(Queue.prototype);
AsyncQueue.prototype.constructor = AsyncQueue;

// 重写原型上的enqueue方法
AsyncQueue.prototype.enqueue = function enqueue(item) {
  const awaiter = this.awaiters.dequeue();
  if (awaiter !== undefined) {
    setImmediate(() => {
      awaiter(item);
    });
  } else {
    // 直接调用父原型的enqueue方法
    Queue.prototype.enqueue.call(this, item);
  }
  return item;
}

方案3:纯函数式委托(无this、无原型)

完全剥离this和原型依赖,把队列数据和操作逻辑分开,父级逻辑作为独立函数存在,子级通过传递数据调用父级函数:

// 父级:创建队列数据结构
function createQueue() {
  return { items: [] };
}

// 父级enqueue操作函数
function enqueue(queue, item) {
  queue.items.push(item);
  return item;
}

// 父级dequeue操作函数
function dequeue(queue) {
  return queue.items.shift();
}

// 子级:创建异步队列
function createAsyncQueue() {
  const baseQueue = createQueue();
  return {
    ...baseQueue,
    awaiters: createQueue(),
    enqueue(item) {
      const awaiter = dequeue(this.awaiters);
      if (awaiter !== undefined) {
        setImmediate(() => {
          awaiter(item);
        });
      } else {
        // 调用父级enqueue函数,传递当前队列和item
        enqueue(this, item);
      }
      return item;
    },
    dequeue() {
      return dequeue(this);
    }
  };
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:55:22