ES6 class 阿里笔试题

class Cash {
   //你的代码

}

const cash1 = new Cash(105);
const cash2 = new Cash(66);

const cash3 = cash1.add(cash2);
const cash4 = Cash.add(cash1, cash2);
const cash5 = new Cash(cash1 + cash2);

console.log(`${cash3}`, `${cash4}`, `${cash5}`);

输出结果为:1元7角1分 1元7角1分 1元7角1分
我只能实现前两个功能:

class Cash {
    constructor(c){
        this.cash = c;
    }
   static add(c1,c2){
       var sum = (c1.cash + c2.cash)+'';
       return `${sum[0]}元${sum[1]}角${sum[2]}分`;
    }
    add(c2){
        var sum = (this.cash + c2.cash)+'';
        return `${sum[0]}元${sum[1]}角${sum[2]}分`;
    }
    toString(){
       return this.cash;
    }

}

const cash1 = new Cash(105);
const cash2 = new Cash(66);

const cash3 = cash1.add(cash2);
const cash4 = Cash.add(cash1, cash2);
const cash5 = new Cash(cash1 + cash2);

console.log(`${cash3}`, `${cash4}`, `${cash5}`);

输出为:1元7角1分 1元7角1分 171

问题:如何让${cash5}输出为1元7角1分?

阅读 6.1k
5 个回答

Edit:
抱歉之前没有考虑链式调用的情况,修改了部分代码

class Cash {
    constructor(money) {
        this.money = money;
    }
    static add(begin = 0, ...cash) {
        return new Cash( cash.reduce((acc, val) => acc + val, begin) );
    }
    add(...cash) {
        return Cash.add(this, ...cash);
    }
    static format(money) {
        let yuan = money / 100 >> 0,
        jiao = (money / 10) % 10 >> 0,
        fen = money % 10;
        return `${yuan}元${jiao}角${fen}分`;
    }
    toString() {
        return Cash.format(this.money);
    }
    valueOf() {
        return this.money;
    }
}
const cash1 = new Cash(1050);
const cash2 = new Cash(66);
const cash3 = cash1.add(cash2);
const cash4 = Cash.add(cash1, cash2);
const cash5 = Cash.add(cash1 + cash2);
const cash6 = cash3.add(cash2,cash1,cash5);
const cash7 = cash5.add(cash2 + cash1).add(cash6);
console.log(`${cash3}\n`,`${cash4}\n`,`${cash5}\n`,`${cash6}\n`,`${cash7}`);

粗略一点可以这么搞

class Cash {
  constructor(c) {
    this.cash = c
  }
  static add(c1, c2) {
    var sum = c1.cash + c2.cash + ''
    return `${sum[0]}元${sum[1]}角${sum[2]}分`
  }
  add(c2) {
    var sum = this.cash + c2.cash + ''
    return `${sum[0]}元${sum[1]}角${sum[2]}分`
  }
  toString() {
    var sum = this.cash.toString()
    return `${sum[0]}元${sum[1]}角${sum[2]}分`
  }
  valueOf() {
    return this.cash
  }
}

const cash1 = new Cash(105)
const cash2 = new Cash(66)

const cash3 = cash1.add(cash2)
const cash4 = Cash.add(cash1, cash2)
const cash5 = new Cash(cash1 + cash2)

console.log(`${cash3}`, `${cash4}`, `${cash5}`)

楼上写的不对,如果add方法不再返回cash实例,那么再进行add操作就没法做了。

简单点就是改写Cash的原型toString。

借鉴了下michael_cai的valueOf思路,每次结果都是Cash的实例

class Cash {
  constructor(value) {
    this.value = value;
  }

  static add(...cashes) {
    const sum = cashes.reduce((pre, cur) => pre + cur) + '';
    return new Cash(sum);
  }

  add(cash) {
    return Cash.add(this, cash);
  }

  toString() {
    const sum = (this + '').padStart(3, 0);
    return `${sum[0]}元${sum[1]}角${sum[2]}分`;
  }

  valueOf() {
    return this.value;
  }
}

const cash1 = new Cash(105);
console.log(cash1 instanceof Cash);

const cash2 = new Cash(66);
console.log(cash2 instanceof Cash);

const cash3 = cash1.add(cash2);
console.log(cash3 instanceof Cash);

const cash4 = Cash.add(cash1, cash2);
console.log(cash4 instanceof Cash);

const cash5 = new Cash(cash1 + cash2);
console.log(cash5 instanceof Cash);


console.log(`${cash3}`, `${cash4}`, `${cash5}`);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题