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

JS中如何实现Dog类eat方法链式调用floss并自动传参

实现Dog类的链式调用并自动传递参数

需求回顾

现有Dog类及调用方式:

class Dog{
  eat(dogName){
    // 原有逻辑
  }
}

// 原调用方式
let doggy = new Dog();
doggy.eat('Max');

需要支持链式调用doggy.eat('Max').floss(),且floss无需重复传入狗名,同时保留原调用方式的兼容性。


方案一:实例属性存储参数(简单直观)

修改Dog类,在eat方法中将狗名存入实例属性,返回实例本身以支持链式调用,同时新增floss方法读取该属性:

class Dog{
  eat(dogName){
    // 执行原有eat逻辑
    console.log(`${dogName} 正在进食`);
    // 把狗名存到实例属性
    this._currentDog = dogName;
    // 返回实例,开启链式调用
    return this;
  }

  floss(){
    // 直接使用实例中存储的狗名
    console.log(`${this._currentDog} 正在清洁牙齿`);
    // 若需继续链式调用其他方法,可继续返回this
    return this;
  }
}

调用验证

  • 原调用方式仍有效:
let doggy = new Dog();
doggy.eat('Max'); // 输出:Max 正在进食
  • 链式调用正常工作:
doggy.eat('Max').floss(); // 输出:Max 正在进食 → Max 正在清洁牙齿

方案二:闭包捕获参数(避免实例属性污染)

如果不想在实例上存储临时参数,可以用闭包让floss直接捕获eat传入的狗名:

class Dog{
  eat(dogName){
    // 执行原有eat逻辑
    console.log(`${dogName} 正在进食`);
    // 返回包含floss的对象,闭包保留当前dogName
    return {
      floss: () => {
        console.log(`${dogName} 正在清洁牙齿`);
        // 若需调用Dog实例的其他方法,返回this即可
        return this;
      }
    };
  }

  // 示例其他实例方法
  bark(){
    console.log('汪汪汪!');
    return this;
  }
}

优势说明

这种方式不会修改实例属性,多次调用eat后,每个返回的floss都对应各自的狗名:

let doggy = new Dog();
const maxOps = doggy.eat('Max');
const buddyOps = doggy.eat('Buddy');

maxOps.floss(); // 输出:Max 正在清洁牙齿
buddyOps.floss(); // 输出:Buddy 正在清洁牙齿
// 还能继续链式调用实例方法
maxOps.floss().bark(); // 输出:Max 正在清洁牙齿 → 汪汪汪!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:12:27