Как получить доступ к частному методу из другого частного метода в Javascript

Мне было интересно, можно ли вызвать частный метод из другого частного метода в Javascript. У меня есть код, подобный следующему:

function Balloon() {
function density( altitude, gas ) {
  /* KG/CU M */

  var gas = { 
   /* GAS DEFINATIONS - wolframalpha.com */
   "hydrogen" : .00100794,
   "helium"   : .004002602,
   "nitrogen" : .0140067,
   "methane"  : .0160425,
   "ammonia"  : .0170305,
   "neon"     : .0201791,
   "dry air"  : .0289644 
  }

  var alt = {
   /* CONSTANTS - http://en.wikipedia.org/wiki/Density_of_air#Altitude */
   "p0" : 101325,   // Sea level standard atmospheric pressure (Pa)
   "T0" : 288.15,   // Sea level standard temperature (K) 
   "g"  : 9.80665,  // Earth-surface gravitational acceleration (m/s^2)
   "L"  : 0.0065,   // Temperature lapse rate (K/m)
   "R"  : 8.31447   // Universal gas constant (mol * K)
  }

  var temperature = alt["T0"] - alt["L"] * altitude;
  var pressure    = alt["p0"] * (1 - (( alt["L"] * altitude ) / alt["T0"] )) ^ (( alt["g"] * gas[gas] ) / ( alt["R"] * alt["L"] ));
  var density     = ( pressure * gas[gas] ) / ( alt["R"] * temperature );

  return density;
 }

 function lift( altitude, gas ) {
  /* KG/CU M */

  return density( altitude, "dry air" ) - density( altitude, gas ); 
 }

 this.requiredGas = function( altitude, gas, ratio, weight ) {
  return (( weight / 1000 ) * ratio ) / lift( altitude, gas );
 }
}

и я пытаюсь получить к нему доступ, например:

balloon = new Balloon();
var required = balloon.requiredGas(10, "helium", 1.5, 4530);

Я видел, как люди объявляли this из-за пределов приватных функций таким образом, но не не знаю, если это, как подойти к этому.


person Kyle Hotchkiss    schedule 08.07.2011    source источник
comment
Ваш код выглядит нормально. Что в нем не работает?   -  person Domenic    schedule 09.07.2011
comment
Я звоню в ball.requiredGas и получаю NaN. lift() не вызывает плотность().   -  person Kyle Hotchkiss    schedule 09.07.2011
comment
@KyleHotchkiss: Вы уверены, что это не так? density находится в той же области, что и lift, так что это не проблема. Это больше похоже на то, что вы не передаете допустимые числа функции.   -  person Felix Kling    schedule 09.07.2011
comment
lift звонит density; если вы поместите alert или console.log в верхней части density, вы увидите, что это правда. Проблема, скорее всего, в том, что вы делите на ноль, т.е. что lift возвращает 0.   -  person Domenic    schedule 09.07.2011
comment
@Domenic: "dry air" не является допустимым числом, поэтому он возвращает NaN (в вашем случае). Деление на 0 возвращает Infinity.   -  person Felix Kling    schedule 09.07.2011
comment
@Kyle: Какова реализация density?   -  person Felix Kling    schedule 09.07.2011
comment
@Flex Kling: ха-ха, да, это правда. Вместо этого попробуем jsfiddle.net/SLQTd/1.   -  person Domenic    schedule 09.07.2011
comment
Код работает, jsbin.com/amawun/2 как выглядит function density?   -  person epascarello    schedule 09.07.2011
comment
Я поставил код выше.   -  person Kyle Hotchkiss    schedule 09.07.2011


Ответы (3)


Вы переопределяете аргумент, который вы передаете в свою функцию density с помощью массива gas.

Видите, он отлично работает, как только я его переименую!

http://jsfiddle.net/pEcMJ/

person josh.trow    schedule 08.07.2011
comment
Вау. Я даже не думал, что это так. Спасибо, что указали на мою проблему, чувак! - person Kyle Hotchkiss; 09.07.2011
comment
@josh Нет, ты просто быстрый. :-) - person Patrick McElhaney; 09.07.2011

Вы переопределяете параметр метода function density( altitude, gas ) с помощью объекта var gas ={}

person Joe    schedule 08.07.2011

Эта строка производит NAN

var pressure    = alt["p0"] * (1 - (( alt["L"] * altitude ) / alt["T0"] )) ^ (( alt["g"] * gas[gas] ) / ( alt["R"] * alt["L"] )); 

It is gas[gas] :)

person epascarello    schedule 08.07.2011