我可以在 Google Apps Scripts 中使用 ES6 (V8) 库中定义的类吗?

rau*_*ltm 4 v8 google-apps-script

我正在尝试使用在库中定义的类,但结果我只收到一个错误。

[LibraryProject]/library/model/Update.gs

class Update {
  constructor(obj = {}) {
    if(typeof obj == "string"){
      options = JSON.parse(obj);
    }
    Object.assign(this, obj);
  }

  text(){
    return (this.message && this.message.text)?this.message.text:''
  }
}
Run Code Online (Sandbox Code Playgroud)

任务

? 创建项目的新版本。(文件 > 管理版本...)

? 在另一个项目中加载这个库 [别名:CustomService] (资源 > 库...)

? 使用 CustomService 的功能

? 使用 CustomService 类

如果我尝试使用类

[普通项目]/index.gs

function test  (){
  Logger.log(CustomService.libraryFunction())
  var update = new CustomService.Update("");
  Logger.log(update)
}

Run Code Online (Sandbox Code Playgroud)

TypeError: CustomService.Update is not a constructor (line 3, archivo "Code")

如何实例化此类的对象?

如果我跑...

在图像中我们可以看到代码和错误

记录器

我们可以看到两个日志,尝试使用类构造函数时正确使用函数和错误

The*_*ter 6

正如官方文档中所写,

库用户只能使用脚本中的以下属性:

  • 可枚举的全局属性
    • 函数声明,
    • 带有 var的函数之外创建的变量,以及
    • 在全局对象上显式设置的属性。

这意味着this 库用户可以使用全局对象中的每个属性。

在 ES6 之前,函数外的所有声明(以及函数声明本身)都是这个全局对象的属性。ES6之后,有两种全局记录:

  • 对象记录 - 与 ES5 相同。

    • 函数声明
    • 函数发生器
    • 变量赋值
  • 声明性记录 - 新

    • 其他一切 - let, const,class

声明性记录中的那些不能从全局“对象”访问,尽管它们本身是全局变量。因此,库用户无法访问库中的类声明。您可以简单地向类添加一个变量赋值,以将属性添加到全局对象(在任何函数之外):

var Update = class Update{/*your code here*/}
Run Code Online (Sandbox Code Playgroud)

参考: