在Javascript中向/从函数传递和返回对象。

时间:2013-07-08 11:14:18

标签: javascript

我已经对上述主题进行了一些挖掘,但现在比起初时更加困惑。

我有一个我正在研究的单位转换器。

它作为基础模型工作正常,但我现在正试图使其更加模块化。

有很多单位和很多转换。

我的计划是有一个函数来确定需要什么类型的转换,温度,区域等,然后可以调用相应的函数来执行数学运算。

我对JS很新,这对我没有帮助,因为它可能是一个简单的错误,但我很可能会犯错误。

我认为问题是将对象传递给下一个函数然后使用它。

我玩了很多代码并在网上尝试了很多不同的建议,但仍然没有成功。

这是我的代码:

<script type="text/javascript">

    function Convert(from, to, units, res){

        this.from = from;
        this.to = to;
        this.units = units;
        this.res = res;
    }

    Convert.convertUnits = function(){

        var measurementType = $(".from option:selected").attr("class");
        var result = "invalid input";
        var input = parseInt(this.units.val());

            if(measurementType == "temp"){
                var test = new Convert($("#from"), $("#to"), $("#units"), $("#result"));
                test.convertTemp();
                console.log('Did we get this far?!?!    ::', measurementType);
            }
        console.log('or not????  ::', measurementType);
    }

    Convert.prototype.convertTemp = function(){

        var result = "invalid input";
        var input = parseInt(this.units.val());
        var f = this.from.val();
        var t = this.to.val()

        if(!isNaN(input)) {
            if(f == "degC"){
                if(t == "degF"){
                    result =  input * 1.8 + 32;
                }
                if(t == "kelvin"){
                    result = input + 273.15;
                }
            }
        }
        console.log('Parsed input is', input, "and result is", result);
        this.res.val(result);
        return result;
    }

    //var calcTempTest = new Convert($("#from"), $("#to"), $("#units"), $("#result"));
    //var test = new Convert($("#from"), $("#to"), $("#units"), $("#result"));

    $("#btnConvert").click.convertUnits();

</script>

2 个答案:

答案 0 :(得分:1)

第一个明显的问题是这一行:

$("#btnConvert").click.convertUnits();

这会尝试调用由convertUnits()返回的jQuery对象的click方法定义的$("#btnConvert")方法。没有这样的方法,所以你会得到关于click没有方法'convertUnits'的方法的错误。

你想要做的是将convertUnits()函数绑定为点击处理程序,你可以将它作为参数传递给.click()方法:

$("#btnConvert").click(Convert.convertUnits)

convertUnits()声明为Convert()的属性是没有意义的,所以(尽管它会按原样运行)我会将其更改为:

function convertUnits() {
   // your code here
}
$("#btnConvert").click(convertUnits);

停止代码工作的唯一另一件事就是在这一行:

var input = parseInt(this.units.val());

...你使用this假设它是一个Convert对象,但是你还没有创建一个units对象 - 你这样做了使用此行在Convert块内:

if(measurementType == "temp")

因此,将该行移至函数的开头,然后使用var test = new Convert($("#from"), $("#to"), $("#units"), $("#result")); 代替test

this

工作演示:http://jsfiddle.net/jT2ke/

一些不相关的建议:function convertUnits(){ var test = new Convert($("#from"), $("#to"), $("#units"), $("#result")); var measurementType = $(".from option:selected").attr("class"); var result = "invalid input"; var input = parseInt(test.units.val()); if(measurementType == "temp"){ test.convertTemp(); console.log('Did we get this far?!?! ::', measurementType); } console.log('or not???? ::', measurementType); } 对于输入转换器的数字没有意义,因为用户可能想要输入小数值。您可以使用parseInt()代替,或使用一元加运算符:

parseFloat()

但是如果你想要var input = +test.units.val(); ,通常建议传递第二个参数来指定基数:

parseInt()

...因为否则如果输入文本具有前导零,则某些浏览器将假定该值是八进制而不是十进制。 (var input = parseInt(test.units.val(), 10); 和一元加号没有那个问题。)

答案 1 :(得分:0)

我认为你不应该在Convert对象里面实现convertUnits方法。新代码如下所示:

convertUnits = function(){

    var measurementType = $(".from option:selected").attr("class");
    var result = "invalid input";
    if(measurementType == "temp"){
        var test = new Convert($("#from"), $("#to"), $("#units"), $("#result"));
        test.convertTemp();
        console.log('Did we get this far?!?!    ::', measurementType);
    }
    console.log('or not????  ::', measurementType);
}

现在您可以点击按钮启动convertUnits:

$("#btnConvert").click(function(){new convertUnits()});