Нет операции, к которой вы можете обратиться, когда значение переменной (x
в вашем случае) равно и заменено на новое значение.Это просто не то, что есть в JavaScript.Вы не можете сделать это даже с прокси.
Ваше первое определение int
, вероятно, примерно настолько близко, насколько вы собираетесь.
Люди пробовали разные способы полученияподобные примитиву вещи, как ваша int
Ни один из них не является действительно удовлетворительным.Например, это не редкая попытка:
class Int {
constructor(value) {
Object.defineProperty(this, "value", {
value: value | 0,
enumerable: true
});
}
set(value) {
return new this.constructor[Symbol.species](value);
}
valueOf() {
return this.value;
}
toString() {
return this.value; // Even though it's not a string
}
static get [Symbol.species]() {
return this;
}
}
затем:
let n = new Int(5);
console.log(`n = ${n}`); // n = 5
n = n.set(n / 2);
console.log(`n = ${n}`); // n = 2
, но как только вы делаете что-то, что не приводит к примитиву, например:
console.log(n);
вы видите его объектность.Вы должны сделать:
console.log(+n);
, что делает его довольно большим, но неизменность помогает с такими вещами, как let m = n
..
Пример:
class Int {
constructor(value) {
Object.defineProperty(this, "value", {
value: value | 0,
enumerable: true
});
}
set(value) {
return new this.constructor[Symbol.species](value);
}
valueOf() {
return this.value;
}
toString() {
return this.value; // Even though it's not a string
}
static get [Symbol.species]() {
return this;
}
}
let n = new Int(5);
console.log(`n = ${n}`); // n = 5
n = n.set(n / 2);
console.log(`n = ${n}`); // n = 2
// But
console.log(n); // (object representation of it)