Javascript 如何将类实例用作静态属性?
我想为名为OuterClass的类创建一个静态属性。我希望此属性的值是另一个类的实例,该类名为Javascript 如何将类实例用作静态属性?,javascript,google-apps-script,Javascript,Google Apps Script,我想为名为OuterClass的类创建一个静态属性。我希望此属性的值是另一个类的实例,该类名为InnerClass 这是内部类。它有一个属性和一个函数 // InnerClass.gs function InnerClass() { this.myProperty = 42; } InnerClass.prototype.myFunction = function() { return 43; }; 这是外部类,它只有一个静态属性 // OuterClass.gs functio
InnerClass
这是内部类。它有一个属性和一个函数
// InnerClass.gs
function InnerClass() {
this.myProperty = 42;
}
InnerClass.prototype.myFunction = function() {
return 43;
};
这是外部类,它只有一个静态属性
// OuterClass.gs
function OuterClass() {
}
OuterClass.innerClass = new InnerClass();
但是,当我尝试调用内部类的方法时,我得到:
TypeError:在对象[object]中找不到函数myFunction
由于在另一个netherClassInstance
上调用实例方法有效,我相信我在静态属性OuterClass.innerClass
上遇到了问题,因为
InnerClass
的构造函数被提升,但InnerClass.prototype.myFunction
未被提升OuterClass.innerClass
,它是用一个不完整的实例实例化的,因为innerClass.prototype.myFunction
未被提升,并且尚未附加到创建的实例对于那些无法复制此问题的用户,这里有一个指向产生此错误的Google表单的链接:
另外,这里还有一个指向脚本项目的直接链接:正如其他人在问题的评论中提到的那样,您的代码对于我来说是一个单独的脚本或三个不同的文件。我所做的唯一一件事(正如迭戈已经说过的)就是为更改
控制台
在执行函数myScript()
时,我在应用程序脚本中获得以下日志(如预期):
[太平洋标准时间19-12-0501:23:28:198]42.0
[太平洋标准时间19-12-0501:23:28:199]43.0
[太平洋标准时间19-12-0501:23:28:199]43.0
此外,如果您仍想使用纯JavaScript
或TypeScript
编写代码,然后迁移到Apps Script
,我建议您使用。正如其他人在问题的评论中提到的,您的代码对于我来说是一个脚本或三个不同的文件,效果很好。我所做的唯一一件事(正如迭戈已经说过的)就是为更改控制台
在执行函数myScript()
时,我在应用程序脚本中获得以下日志(如预期):
[太平洋标准时间19-12-0501:23:28:198]42.0
[太平洋标准时间19-12-0501:23:28:199]43.0
[太平洋标准时间19-12-0501:23:28:199]43.0
另外,如果您仍想使用纯JavaScript
或TypeScript
编写代码,然后迁移到Apps Script
,我建议您使用。我最终使用的解决方法是使用getter延迟初始化静态属性类实例。这有点冗长,但这样,吊装就不是问题了
// OuterClass.gs
function OuterClass() {
}
OuterClass.getInnerClass = function() {
if (OuterClass.innerClass === undefined) {
OuterClass.innerClass = new InnerClass();
}
return OuterClass.innerClass;
}
我最终使用的解决方法是使用getter延迟初始化静态属性类实例。这有点冗长,但这样,吊装就不是问题了
// OuterClass.gs
function OuterClass() {
}
OuterClass.getInnerClass = function() {
if (OuterClass.innerClass === undefined) {
OuterClass.innerClass = new InnerClass();
}
return OuterClass.innerClass;
}
解析顺序
虽然我不知道在Rhino运行时内部是如何解析脚本文件的(您的项目建议您使用它,而不是新的V8),但在迁移指南中提到了文件的顺序,因此让我们假设代码库在解析之前连接在一大块中
这个过程似乎在某种程度上取决于文件创建顺序。通过使用简单闭包检查调用顺序,我成功地在Rhino中重现了您的问题,请看:
//bbbb.gs-首先创建
函数父函数(){}
Parent.child=(函数(){
console.log(“分配的子项”);
返回新的子对象();
})();
//aaaa.gs
函数子(){
log(“子构造函数”);
}
Child.myMethod=(函数(){
log(“分配的子静态方法”);
返回函数(){}
})();
Child.prototype.myMethod=(函数(){
console.log(“分配的子方法”);
返回函数(){}
})();
函数testCP(){
console.log(Parent.child.myMethod);
}
正如所料,当您运行testCP
时,日志中的调用顺序如下所示:
现在,如果在文件中切换代码,日志看起来会有所不同(这会产生您想要的结果):
替代解决方案
您为自己提供的延迟加载(单例模式)应该足够了。我只建议使用依赖倒置来给自己更多的灵活性,并使InnerClass
成为硬依赖:
//bbbb.gs
函数父函数(){}
Parent.setChild=函数(子函数){
Parent.child=新的子对象();
}
//aaaa.gs(省略代码相同)
函数testCP(){
Parent.setChild(Child);
console.log(Parent.child.myMethod);//函数(){}
}
这一次,在任何方向上,一切都按预期进行:
解析顺序
虽然我不知道在Rhino运行时内部是如何解析脚本文件的(您的项目建议您使用它,而不是新的V8),但在迁移指南中提到了文件的顺序,因此让我们假设代码库在解析之前连接在一大块中
这个过程似乎在某种程度上取决于文件创建顺序。通过使用简单闭包检查调用顺序,我成功地在Rhino中重现了您的问题,请看:
//bbbb.gs-首先创建
函数父函数(){}
Parent.child=(函数(){
console.log(“分配的子项”);
返回新的子对象();
})();
//aaaa.gs
函数子(){
log(“子构造函数”);
}
Child.myMethod=(函数(){
log(“分配的子静态方法”);
返回函数(){}
})();
Child.prototype.myMethod=(函数(){
console.log(“分配的子方法”);
返回函数(){}
})();
函数testCP(){
有限公司