在CDK Stack构造函数中使用this.formatArn()与cdk.Stack.of(this).formatArn()的区别
this.formatArn() 和 cdk.Stack.of(this).formatArn() 的区别
先给结论:在当前Stack的构造函数里,这两种写法的实际效果完全一样,但背后的逻辑有区别:
核心差异
this.formatArn():因为你当前写代码的类本身就是Stack的实例,直接调用实例自带的formatArn()方法,是最直接的调用方式,没有额外的逻辑开销。cdk.Stack.of(this).formatArn():Stack.of()是个静态工具方法,它的本职工作是从任意Construct节点(比如Stack里的Lambda、S3桶这些子资源)向上遍历,找到它所属的Stack实例。但在Stack自己的构造函数里,this就是Stack实例本身,所以Stack.of(this)直接返回this,后续调用formatArn()自然和直接调用效果一致。
为什么两种写法都不报错
编译器不会报错的原因很简单:
- 对于
this.formatArn():this的类型就是Stack,Stack类本身就定义了formatArn()方法,属于合法调用。 - 对于
cdk.Stack.of(this).formatArn():Stack.of()的返回值类型被TS定义为Stack,所以调用它的formatArn()方法同样符合类型检查规则,编译器认可这种写法。
什么时候该用哪种?
- 如果确定当前代码就在Stack类的范围内(比如构造函数里),直接用
this.formatArn()更简洁高效。 - 如果是在Stack的子Construct里(比如写一个自定义的Lambda构造类),没法直接拿到Stack实例,就必须用
Stack.of(this)先找到所属的Stack,再调用formatArn()。
内容的提问来源于stack exchange,提问作者Jing
相关产品推荐
相关产品推荐

