雖然與function
和prototype
相比,我們對es2016中的class
功能有點困惑,但它的行爲在某些情況下是不同的,特別是 - 類不能被稱爲相同的功能,似乎沒有辦法找出函數是類構造函數還是簡單的函數,而不使用toString
和/^class/
RegExp
。如何識別該函數是類構造函數,以及如何將其作爲函數調用?
假設的例子:
class Foo {
constructor() {
this.name = 'foo';
}
}
function Bar() {
this.name = 'bar';
}
function doSmth (anyArg) {
if (typeof anyArg === 'function') {
var obj = { someProp: 'qux' };
anyArg.call(obj);
return obj;
}
// ...
}
doSmth(Bar);
doSmth(Foo); // Class constructor Foo cannot be invoked without 'new'
是typeof 'function'
,但不能把它作爲一個功能!尼斯。
這裏是我的2個問題:
- 有一些方法我可以調用
Foo
構造函數一樣Bar
與重寫this
背景? - 有什麼方法可以檢測到
anyArg
是一個類的構造函數,因此我可以在我的doSmth
函數中以不同方式處理它。沒有toString
和RegExp
(作爲性能損失將是巨大的在這種情況下)。然後,我可以使用Reflect.construct
來初始化新實例,並使用Object.assign
來擴展我的obj
變量與來自實例的值。
謝謝,亞歷克斯
FWIW,這聽起來很瘋狂,而我的)不知道到底是一個什麼樣接收和b)想強迫對象的構造類似。 – deceze
[如何區分箭頭函數,類和普通函數?](http://stackoverflow.com/a/31947622/1048572) – Bergi