【问题标题】:Javascript method returns the method code as a stringJavascript 方法以字符串形式返回方法代码
【发布时间】:2012-08-02 15:55:48
【问题描述】:

我正在尝试让我的对象的方法起作用,但我遗漏了一些东西 - 可能非常明显!

我找到了以下主题:How do you create a method for a custom object in JavaScript? 但无论我尝试什么,我的方法都只是将函数代码作为文字字符串返回。

我也尝试查看对象字面量JavaScript - Advantages of object literal,但作为 JS 新手,我看不到如何将初始参数传递给对象!

所以,上下文....

我正在创建一个基于日期、时间和位置进行各种天文计算的网页。我有一组年、月、日、小时、分钟、秒、时区、纬度和经度的输入。我将其用作 JS 的学习经验,以及理解计算!

我正在创建一个全局日期对象来保存日期元素,并且我想创建一个计算儒略日数的方法。

我用代码创建了一个小提琴:http://jsfiddle.net/AstroDaz/gKQ5f/5/

function DATE_OBJ (iyear,imonth,iday,idirty,ijd) {
    this.Year = iyear;
    this.Month = imonth;
    this.Day = iday;
    this.Dirty = idirty;
    this.JD = DateJD;
}

function DateJD() {
    var Y = objDate.Year;
    var M = objDate.Month;
    var D = objDate.Day;

    if (M < 3) {
        --Y;
        M +=12;
    }

    if (objDate.Year > 1582) {

      var A = parseInt(Y / 100, 10);
      var B = 2 - A + parseInt(A / 4,10);
      } else {
        if (objDate.Year = 1582 && M > 10) {
          var A = parseInt(Y / 100, 10);
          var B = 2 - A + parseInt(A / 4,10);
          } else {
            if (objDate.Year = 1582 && M = 10 && D >=15) {
              var A = parseInt(Y / 100, 10);
              var B = 2 - A + parseInt(A / 4,10);
              } else var B = 0;
          }
        }

    if (Y < 0) var C = parseInt((365.25 * Y) - 0.75,10);
    else var C = parseInt(365.25 * Y,10);

    var E = parseInt(30.6001 * (M + 1),10);
    this.JD = B + C + E + objDate.Day + 1720994.5;
}


var d = new Date();    
var objDate = new DATE_OBJ (d.getFullYear(),d.getMonth(),d.getDate(),false,0);

document.write(objDate.JD);​

如您所见,结果是对象的 JD 属性被赋值为方法代码的文字字符串,而不是计算的结果!

顺便说一句,如果我将 DateJD 创建为直接函数并调用它,它会起作用并返回正确的结果。

感谢您的帮助! 达兹

【问题讨论】:

    标签: javascript object methods


    【解决方案1】:

    使用this.JD = DateJD,您不是在分配返回值,而是分配一个可调用函数。所以你的计算永远不会执行,而只是分配给成员变量。

    如果你把DateJD的最后一行从

    this.JD = B + C + E + objDate.Day + 1720994.5;
    

    return B + C + E + objDate.Day + 1720994.5;
    

    然后通过调用它

    document.write(objDate.JD());​
    

    它会返回一个数字:http://jsfiddle.net/gKQ5f/6/

    如果你在'构造函数'中执行你的函数,那么没有可以使用的现有objDate 对象,你会得到类似的东西

    未捕获的类型错误:无法读取未定义的属性“年份”


    顺便说一句,您可能想要更改这些条件:

    if (objDate.Year = 1582 && M > 10) {
    

    这会将 objDate.Year 分配给 1582,而不是检查它是否等于。
    取而代之的是objDate.Year == 1582

    【讨论】:

    • 非常感谢丹!珍惜时间!!并感谢您发现分配错误!我在别处有这个,我以为我把它们都抓了!
    猜你喜欢
    • 1970-01-01
    • 2020-04-13
    • 2023-03-30
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    相关资源
    最近更新 更多