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
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;
}
}
- 标准答案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
}
}
- 借鉴了某个大神的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}`);