gpt4 book ai didi

javascript - 有没有办法让算术运算符在 Javascript ES6 中使用 getter 和 setter?

转载 作者:行者123 更新时间:2023-11-30 13:51:45 25 4
gpt4 key购买 nike

我有一个基本的 ID 系统,其中一个数字被翻译成一个字符串并用零填充至少 3 位数字。只要我只使用常规作业,它就可以正常工作。有没有办法让算术运算符也与 setter 一起工作?

class Test {
constructor() {
this.id = 0;
}

/**
* @param {Number} num
*/
set id(num) {
if (num < 10) {
this._id = '00' + num;
} else if (num < 100) {
this._id = '0' + num;
} else {
this._id = '' + num;
}
}

get id() {
return this._id;
}

incrementID(increment=1) {
const id = parseInt(this.id);
this.id = id + increment;
}
}

const test = new Test();
test.id = 5;
console.log(`ID is: ${test.id}`); // ID is: 005

test.id += 5;
console.log(`ID is: ${test.id}`); // ID is: 00055 (How?!?)

我知道我可以有一个像我写的那样的 incrementID 方法,但这感觉像是违背了 ES6 setter 和 getter 的哲学。

作为旁注,加法作业甚至发生了什么?如果有什么奇怪的话,我会期望结果是 0055,因为它是一个被添加到字符串中的数字。

最佳答案

好吧,理论上您可以使“id”成为一个对象并提供一个钩子(Hook)以默认将其转换为数字:

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

[Symbol.toPrimitive](hint) {
if (hint === 'number' || hint === 'default')
return Number(this.value)
return String(this.value);
}
}

class Test {
constructor() {
this.id = new ID('000');
}

set id(num) {
let s;
if (num < 10) {
s = '00' + num;
} else if (num < 100) {
s = '0' + num;
} else {
s = '' + num;
}
this._id = new ID(s);

}

get id() {
return this._id;
}
}


const test = new Test();
test.id = 5;
console.log(`ID is: ${test.id}`); // ID is: 005

test.id += 5;
console.log(`ID is: ${test.id}`); // ID is: 010

Docs

也就是说,一种实用的方法是拥有两个属性(数字和格式化字符串),如上文所建议的。

关于javascript - 有没有办法让算术运算符在 Javascript ES6 中使用 getter 和 setter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58107707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com