Получатель и установщик без участников - PullRequest
0 голосов
/ 06 декабря 2018

Можем ли мы использовать методы получения и установки без определения метода для члена?

Например, преобразовать это

class int {
    set value(val) {
        this._value = val | 0; // Truncate
    }
    get value() {
        return this._value;
    }
}

var x = new int();

x.value = 5 / 2;
console.log(x.value); // shows 2 instead of 2.5

во что-то вроде этого:

class int {
    set (val) {
        this = val | 0; // Truncate
    }
    get () {
        return this;
    }
}

var x = new int();

x = 5 / 2;
console.log(x); // shows 2 instead of 2.5

1 Ответ

0 голосов
/ 06 декабря 2018

Нет операции, к которой вы можете обратиться, когда значение переменной (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)
...