2014-09-05 3 views
0

Это преобразователь единиц в JS. Когда кто-то конвертирует тома, входной объем сначала преобразуется в литеры, а затем в каждую другую единицу. Вычисленные значения автоматически отображаются в полях ввода. Для этой цели я создал объект для хранения преобразования значений, например так:Использование математических операций в объектах

var volumes={ 
    cbm: 1000, 
    ltr: 1, 
    ml: 0.001, 
    barrel: 158.9873, 
    gal: 3.785411784, 
    pint: 0.473176473, 
    floz: 0.0295735295625, 
    //and so on 
}; 

И для преобразования между блоками одной системы я попытался это:

var volumes={ 
    impfloz: 0.0284130642624675, 
    imppint: this.impfloz*20, 
    impbarrel: this.impfloz*5600, 
    impgal: this.impfloz*160 
}; 

Но это не сработало , Когда я печатаю значение, например. в поле ввода «Imperial-Barrel» отображаются все остальные поля ввода: NaN. Должен ли я писать функции для каждого из них? Это сделало бы код намного сложнее и труднее читать. Есть ли способ заставить членов объекта автоматически применять желаемую математическую операцию?

+0

См. [Самостоятельные ссылки в декларациях литералов объектов] (http://stackoverflow.com/a/4616273/218196) –

ответ

1

Нет, вы не можете этого сделать. Но что случилось с

var impfloz = 0.0284; 
var volumes={ 
    impfloz: impfloz, 
    imppint: impfloz*20, 
    impbarrel: impfloz*5600, 
    impgal: impfloz*160 
}; 

Если вы беспокоитесь о загрязнять глобальное пространство имен с переменной impfloz, вы можете обернуть все это в IIFE.

this имеет смысл только в пределах функции, где он относится к объекту, с которым была вызвана функция.

+0

Спасибо за вашу информацию. Это работает, но я думаю, что это не очень элегантно ... Но можете ли вы также объяснить мне, почему, когда я набираю 1000000000000 в поле ствола, поле галлона показывает 34999999999999.992 вместо 35000000000000? Я имею в виду, именно поэтому я и пытался это сделать. JS автоматически отключает некоторые десятичные знаки, и если да, есть ли способ предотвратить это? – quaductas

+0

@quaductas JS numbers - «числа с плавающей запятой двойной точности», и они ограничены примерно 2^53, если вам нужны более высокие значения, вам нужно будет использовать библиотеку. –

Смежные вопросы