Свойство класса Javascript, рассчитанное из других свойств в том же классе

Это, наверное, что-то довольно глупое, что мне не хватает, но как мне получить свойство класса для автоматического пересчета на основе значений других свойств в одном классе?

например.

function Test() {
    this.prop1 = 1;
    this.prop2 = 2;
    this.prop3 = this.prop1 + this.prop2;

}

tester = new Test();

alert (tester.prop1); // expect 1
alert (tester.prop2); // expect 2
alert (tester.prop3); // expect 3

tester.prop1 += 1;

alert (tester.prop1); // expect 2
alert (tester.prop2); // expect 2
alert (tester.prop3); // expect 4

или мне нужно, чтобы prop3 был установлен = calcProp3(), а затем включил такую ​​функцию:

this.calcProp3 = function() {
        var calc = this.prop1 + this.prop2;
        return calc;
    }

Спасибо всем.

Ответ 1

или мне нужно, чтобы prop3 был установлен = calcProp3(), а затем включил функцию

У вас есть два варианта:

  • Создайте свойство с getter, которое выглядит как простой доступ к свойствам при его использовании, но на самом деле вызывает функцию или

  • Сделайте свою функцию calcProp3, которая делает очевидным для кодера с помощью Test, что они вызывают функцию

Вариант 2 - это ваш единственный вариант, если вам нужно поддерживать действительно устаревшие браузеры, такие как IE8, поскольку IE8 не поддерживает getters.

Использование геттера

Здесь в 2017 году вы, вероятно, определите его в class (пересылая при необходимости для браузеров, которые не поддерживают ES2015 [aka "ES6" ] class):

class Test {
  constructor() {
    this.prop1 = 1;
    this.prop2 = 2;
  }
  get prop3() {
    return this.prop1 + this.prop2;
  }
}
const t = new Test();
console.log(t.prop3); // 3
t.prop1 = 2;
console.log(t.prop3); // 4

Ответ 2

Javascript теперь поддерживает стандартный способ реализации сеттеров и геттеров через Object.defineProperties().

function Test() {
    this.prop1 = 1;
    this.prop2 = 2;
}
Object.defineProperties(Test.prototype, {
    prop3: {
        get: function test_prop3_get(){ return this.prop1 + this.prop2 },
    },
});

tester = new Test();

alert (tester.prop1); //=> 1
alert (tester.prop2); //=> 2
alert (tester.prop3); //=> 3

tester.prop1 += 1;

alert (tester.prop1); //=> 2
alert (tester.prop2); //=> 2
alert (tester.prop3); //=> 4

Ответ 3

После ES6 вы можете вычислить в конструкторе:

class Test {
  constructor() {
    this.prop1 = 1;
    this.prop2 = 2;
    this.suma = this.prop1 + this.prop2;
  }
  get prop3() {
    return this.suma;
  }
}
const t = new Test();
console.log(t.suma);
console.log(t.prop3); // 3