我可以在 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*/}
参考文献:
我正在尝试使用库中定义的 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*/}