2016-09-22 36 views
2

以下代碼由ts-node正確編譯和執行。In Typescript什麼是數組作爲函數名稱?

class C { 
    ["abc"]() { 
     return "C"; 
    } 
} 

let c = new C(); 

let className = c["abc"](); 
console.log(className); 

但我不明白以下作爲類屬性。

["abc"]() {} 

我認爲它涉及計算屬性的概念,但我不明白這個語法。

問題1:

[ 「ABC」]是索引爲0與一個字符串元素的數組如果添加函數定義在其周圍,那麼[ 「ABC」](){},則之後怎麼樣了?你怎麼能使用一個數組作爲函數名?

問題2:

爲什麼不通過以下方式來調用成員方法?

c.["abc"](); 
+3

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer – SLaks

+1

@SLaks謝謝!這是我以前不知道的概念。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer#Computed_property_names –

回答

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用於迭代自定義類型。

0

爲什麼不通過以下方式來調用成員方法,將被推薦

是啊。但如果你想通過配置(非靜態)例如電源一個來自服務器的字符串,您可以使用索引器語法。

相關問題