以下代码由ts-node正确编译和执行。
class C {
["abc"]() {
return "C";
}
}
let c = new C();
let className = c["abc"]();
console.log(className);
但是我不理解以下类属性。
["abc"]() {}
我认为它涉及计算属性的概念,但我不理解这种语法。
问题1:
[“abc”]是一个在索引0处有一个字符串元素的数组。如果你在它周围添加一个函数定义,那么[“abc”](){},那么它是什么呢?你怎么能使用数组作为函数名?
问题2:
为什么不通过以下方式调用成员方法?
c.["abc"]();
答案 0 :(得分:1)
就像foo['bar']
和foo.bar
是访问对象成员的等效方法一样,您可以在object initializers中使用['bar']
的索引器语法和类定义。
对于您的示例,在编译时静态地知道该属性,这并没有真正为您提供任何优势,因为它直接等同于以下内容:
class C {
abc() {
return "C";
}
}
但是,索引器语法确实允许您执行一些其他方式无法实现的功能。
例如,您可以使用非有效标识符的成员名称,例如以数字开头的名称,或者里面有破折号:
class C {
['123foo']() { … }
['foo-bar']() { … }
}
它还允许您通过从变量中获取成员名称来动态指定成员名称:
let memberName = 'foo';
class C {
[memberName]() { return 'bar'; }
}
console.log(new C().foo()); // bar
这也用于JavaScript中的Symbols,它提供了一种在对象上定义成员的方法,这些对象不是自由可见的,但只能通过直接访问同一个符号对象来访问。这将最终允许新的高级功能,如Symbol.iterator
用于迭代自定义类型。
答案 1 :(得分:0)
为什么不通过以下方式调用成员方法
是推荐的。但是如果你想通过配置来供电某些东西(不是静态的),例如来自服务器的字符串,您可以使用索引器语法。