没有成员的getter和setter

时间:2018-12-06 08:17:32

标签: javascript getter-setter

我们可以在不为成员定义方法的情况下使用getter和setter吗?

例如,对其进行变换

(Background on this error at: http://sqlalche.me/e/e3q8)

像这样:

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

1 个答案:

答案 0 :(得分:2)

用新值替换变量(在您的情况下为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)