Mac Automation脚本 - 将对象作为值传递

时间:2018-01-05 19:10:47

标签: javascript macos osascript

我正在尝试将Date对象作为值传递给Mac Automation Scripting的Javascript构造函数。这是我试图运行的代码:

app = Application.currentApplication();
app.includeStandardAdditions = true;
app.strictPropertyScope = true;

Date.prototype.month = function () {
  return this.getMonth();
};

class Birthday {
  constructor(name, date) {
    this.name = name;
    this.date = date;
    this.mydate = new Date(2018, 0, 5);
  }
}

var birthdays = [];
birthdays.push(new Birthday('John Doe1'), Date.now(2018, 0, 1));
// birthdays.push(new Birthday("John Doe2"), Date.now(2018, 0, 2));
// birthdays.push(new Birthday("John Doe3"), Date.now(2018, 0, 3));
// continued ...

console.log(birthdays[0].name);   // John Doe1
console.log(birthdays[0].date);   // undefined (*1)
console.log(birthdays[0].month);  // undefined (*2)
console.log(birthdays[0].mydate); // Fri Jan 05 2018 00:00:00 GMT...

意外结果:

  1. 未定义为Birthday class
  2. 的成员
  3. 对于我添加到Date.prototype
  4. 的函数未定义

    此代码用于工作。正如您所看到的,如果我在构造函数中实例化Date,它将起作用。所以,我可以按如下方式更改Birthday类的构造函数:

    class Birthday {
      constructor(name, year, month, day) {
        this.name = name;
        this.date = new Date(year, month, day);
      }
    }
    

    但是,我有很多生日实例,我很好奇为什么这段代码不再有效。

    如果您对此事有任何了解,请告诉我。提前谢谢。

2 个答案:

答案 0 :(得分:0)

您将Date.now()的结果传递给构造函数。 Date.now会返回Number,而不是Date个对象。

您可能需要以下内容:

birthdays.push(new Birthday('John Doe1', new Date(2018, 0, 1)));

代替。

修改

我刚刚注意到语法错误。你过早关闭你的parens,所以在你的代码中你永远不会将Date.now()结果作为构造函数参数传递,你将它作为第二个参数传递给birthdays.push()。你想要改变:

birthdays.push(new Birthday('John Doe1'), Date.now(2018, 0, 1));

birthdays.push(new Birthday('John Doe1', new Date(2018, 0, 1)));

答案 1 :(得分:0)

以及bmceldowney所说的内容,当你调用它时,你并没有传递date个对象而month应该是month() cus它是一个函数而不是属性