我可以在 Google Apps 脚本中使用 ES6 (V8) 库中定义的 Class 吗?

Can I use in Google Apps Scripts a defined Class in a library with ES6 (V8)?

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

[图书馆项目]/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:''
  }
}

任务

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

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

✅ 使用 CustomService 的功能

❌ 使用 CustomService

的 class

如果我尝试使用 Class

[正常项目]/index.gs

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

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

如何实例化此 Class 的对象?

如果我运行...

记录器

根据您的测试,您似乎无法直接从 GAS 库中导入 class。我建议改为创建一个工厂方法来实例化 class。

大致如下:

// Library GAS project

/**
 * Foo class
 */
class Foo {
    constructor(params) {...}

    bar() {...}
}

/* globally accessible factory method */
function createFoo(fooParams) {
    return new Foo(fooParams);
} 

// Client GAS project

function test() {
    var foo = FooService.createFoo(fooParams);
    Logger.log(foo.bar());
}

正如官方文档中所写,

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

  • enumerable global properties
    • function declarations,
    • variables created outside a function with var, and
    • properties explicitly set on the global object.

这意味着全局 this 对象中的每个 属性 都可供图书馆用户使用。

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

  • Object record- Same as ES5.

    • Function declarations
    • Function generators
    • Variable assignments
  • Declarative record - New

    • Everything else - let, const, class

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

var Update = class Update{/*your code here*/}

参考文献: