GOOGLE ADS

вторник, 3 мая 2022 г.

Свойства объекта Javascript, вычисляемые (на лету) из других свойств объекта

Я пытаюсь создать объект javascript, который вычисляет различные значения для установленных на нем свойств. Я собрал этот простой пример того, чего я пытаюсь достичь: JSFIDDLE

var obj = {};
obj.a = 2;
obj.b = 5;
obj.avg = "(obj.a + obj.b)/2";
obj.rounded = "Math.floor(eval(obj.avg))";
console.log("rounded avg: " + eval(obj.rounded));
//simulate changing properties
obj.a = Math.floor(Math.random() * 10);
obj.b = Math.floor(Math.random() * 10);
console.log("rounded avg: " + eval(obj.rounded));

Приведенный выше код в настоящее время достигает того, что я хочу (используя стандартные заданные значения, такие как «a» и «b», для вычисления «avg», а затем используя «avg» во втором вычислении «округлено»).

Есть ли лучший способ добиться этого (в идеале без eval()вызовов всякий раз, когда на вычисляемое свойство ссылается другое свойство).

Я хотел бы, чтобы вычисляемые свойства действовали как функции (вычисляли их значение всякий раз, когда на них ссылаются), а не вычисляли их значение изначально и не менялись - я хотел бы избежать использования ()для вызова функций (чтобы я мог ссылаться как обычные значения, так и вычисляемые значения одинаковы - только по имени их свойства).


Решение проблемы

Вместо использования evalиспользуйте следующие функции:


var obj = {};
obj.a = 2;
obj.b = 5;
obj.avg = function() { return (this.a + this.b) / 2; };
obj.rounded = function() { return Math.floor(this.avg()); };
console.log("rounded avg: " + obj.rounded());
obj.a = Math.floor(Math.random() * 10);
obj.b = Math.floor(Math.random() * 10);
console.log("rounded avg: " + obj.rounded());

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...