Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将类实例用作静态属性?_Javascript_Google Apps Script - Fatal编程技术网

Javascript 如何将类实例用作静态属性?

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

我想为名为OuterClass的类创建一个静态属性。我希望此属性的值是另一个类的实例,该类名为
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
    未被提升,并且尚未附加到创建的实例
  • 有没有办法将类实例用作静态变量?请注意,我必须使用基于原型的类,因为我实际上使用的是基于过时的JavaScript版本的GoogleApps脚本


    对于那些无法复制此问题的用户,这里有一个指向产生此错误的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(){
    有限公司