在 Typescript / Javascript 中,給定類:
class T {
method_a() {
console.log('Inside method a');
}
}
我需要像這樣訪問(無界)方法,但它undefined改為:
const method_to_be_passed = T.method_a; // undefined
在python中,我會得到這樣的未系結方法:
class P:
def method_a():
print('inside method a')
the_method = P.method_a # <function P.method_a at 0x7fee48eff310>
然后我可以將它系結到一個物件來呼叫它。我將如何在 TS / JS 中執行等效操作?
打字稿編譯器顯示以下錯誤:
error TS2339: Property 'method_a' does not exist on type 'typeof T'.
uj5u.com熱心網友回復:
在 JavaScript 中,可以通過類的 訪問類的實體方法prototype:
class T {
method_a() {
console.log('Inside method a');
}
}
const method_to_be_passed = T.prototype.method_a;
請注意,如果您this在方法中參考類的實體,則需要將方法系結到類的某個實體,T如下所示:
const method_to_be_passed = T.prototype.method_a.bind(some_instance_of_T);
uj5u.com熱心網友回復:
請記住,classJavaScript/TypeScript中的定義只是用于定義建構式和prototype屬性的語法糖(即簡寫):
所以這
class T {
val: number = 1;
method_a() {
console.log('Inside method a');
}
}
(我添加了該val屬性作為附加示例)
相當于:
function T() {
this.val = 1;
}
T.prototype.method_a = function() {
console.log('Inside method a');
};
因此,要獲得對該method_a函式的參考,您需要使用prototype限定符:
const method_to_be_passed = T.prototype.method_a;
這與 Python、C#、C 等其他語言不同,這些語言讓您static無需額外限定即可參考型別的實體和非實體(即)(當然,您不能有意義地使用沒有this引數的實體成員,當然)。
如果你想method_a以不要求this引數,那么你需要使它成為一個靜態成員:
class T {
val: number = 1;
static method_a() {
console.log('Inside method a');
}
}
這確實允許您這樣做:
const method_to_be_passed = T.method_a;
游樂場示例:
https://www.typescriptlang.org/play?target=1#code/MYGwhgzhAEASkEkB2EAuYnAKYFksFsAjLAJxgG8AoS6W6ANzBAC5okBXI06AXmgEYA3NTrQA5llQMmABRDsI-ABQBKVhy4loVUaJKT2JJNFQALAJYQAdIxDQA1AOGiAviLrmU6TFgBi7TFVtGl1aYAB7FHCQLCsQcLElAHJPNAxsf0wklWc6NzdKUEgYeAgAZXRUc2A8TQgqENo0quBpFjZOYi0 IXcmyurxSTa5BWU1Ds1g0Np9VENjUoqwFtqu61sHJ0boAtFmwYPgTOAgnRmIqJi4hOSjk zc2nygA
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/323698.html
標籤:javascript 打字稿
