簡體   English   中英

如何在ES6中獲取類函數的引用?

[英]How to get a reference to a class function in ES6?

對不起,如果問題太簡單了,但我在這里遺漏了一些東西。 剛剛切換了一個看起來像的ES5模塊:

module.exports = {
  func1: function(a, b) {...},
  func2: function(a, b) {...}
};

對於看起來像這樣的ES6類:

export default class {
  func1(a, b) {...}
  func2(a, b) {...}
}

一切都很順利:在這兩種情況下我都可以export mod from 'module'; 並調用mod.func1(a, b)mod.func2(a, b)

但是,我有一個函數可以調用模塊函數來調用:

var caller = function(func, val1, val2) {
  let a = something(val1);
  let b = something(val2);
  return func(a, b);
};

當我調用caller(mod.func1, x, y)我得到了第一個實現所需的結果,但是undefined is not a function第二個實現undefined is not a function

在兩種情況下,打印出mod.func1的值mod.func1返回[Function] ,但顯然會從ES6類返回其他內容。

我做錯了什么,如何獲得我可以在另一個函數中調用的類函數?

更新:使用第二個實現,我忘了添加實例化代碼:

import Mod from 'module';
var mod = new Mod();
class MyClass {
  method(args) {}
}

簡而言之:

function MyClass() {}
MyClass.prototype.method = function(args){};

您正在尋找的是構造函數上的static方法,在ES {3,5}中以這種方式完成:

function MyClass() {}
MyClass.method = function(args){};

在ES6中使用static修飾符完成:

export default class {
  static func1(a, b) { /* stuff */ }
  static func2(a, b) { /* stuff */ }
}

但是,即使在對象中也可以使用簡寫方法,因此在一般情況下使用普通對象更加清晰:

export default {
  func1(a, b) {/* stuff */},
  func2(a, b) {/* stuff */}
}

為什么構造函數上沒有原型方法?

因為在ES3或ES5中不是這樣的:

function MyClass() {};
MyClass.prototype.method = function(args) {};

MyClass.method  // undefined

var instance = new MyClass();
instance.method  // function(args) {}

必須創建實例才能訪問原型上的方法。

為什么要切換到class構造(對於構造函數和使用這些方法的原型,它比語法糖更多一點)? 沒有理由不像以前那樣使用對象文字 - 你也可以在那里使用方法語法:

export default {
  func1(a, b) {...},
  func2(a, b) {...}
};

不是使用“靜態”方法導出對象,而是使用命名導出更合理:

export function func1(a, b) {...}
export function func2(a, b) {...}

如果你想使用mod作為命名空間,你可以通過import * as mod from 'module' mod

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM