Свойство класса 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