Skip to content

Latest commit

 

History

History
136 lines (125 loc) · 3.19 KB

根据面向对象编程思想设计一个表达人民币的类.md

File metadata and controls

136 lines (125 loc) · 3.19 KB

请根据面对对象编程的思想,设计一个类型 Cash 用于表达人民币,使得:

class Cash {
// todo
}
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分

该题考察ES6的class类、构造函数、继承以及static静态方法,为阿里一道难度较高的面试题

一开始我的答案:

class Cash {
    constructor(money){
        this.money = money;
    }
    static add(c1,c2){
        let sum = (c1.money + c2.money)+'';
        return `${sum[0]}元${sum[1]}角${sum[2]}分`;
    }
    add(c2){
        let sum = (this.money + c2.money)+'';
        return `${sum[0]}元${sum[1]}角${sum[2]}分`;
    }
    toString(){
        return this.money;
    }
}
其实是有问题的
//1元7角1分, 1元7角1分 171
  1. 标准答案1
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;
    }
}
  1. 标准答案2(比较粗糙)
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
    }
}
  1. 借鉴了某个大神的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); //true

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

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

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

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

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