簡體   English   中英

沒有“ extends”關鍵字的ES6類繼承

[英]ES6 class inheritance without “extends” keyword

我想在沒有extends關鍵字的es6類中進行繼承:

典型方法:

class Foo extends Bar {
  contructor() {
    ...
  }
}

我正在尋找的是生成具有相同簽名但使用此模式的對象:

class Foo {
  contructor(Bar) {
    // use Bar class somehow
    ...
  }
}

謝謝

==編輯==

內容:

我為JS庫threejs構建了一個擴展( ami )。 它提供了可以在threejs中無縫運行的新對象。

問題:

threejs具有一種內部機制,可以為每個對象生成唯一的ID,這對於其正確的行為至關重要。

當前的實現依賴於three作為全局變量公開,因此創建對象的任何人都必須引用它以確保id實際上是唯一的。

// in ami
// ID of this object will be unique accros all classes
// that are based of global THREE.Mesh
class Foo extends THREE.Mesh {
  contructor() {
    ...
  }
}

使用全局變量可以很好地工作,但是我想擺脫全局名稱空間的要求。

如果我在ami和應用程序中未引用相同的基本元素,則id可能會沖突。

// in ami
import {Mesh} from 'three';

class Foo extends Mesh {
  contructor() {
    ...
  }
}

// in my app
import {Foo} from 'ami';
imoport {Mesh} from 'three';

const foo = new Foo(); // it uses "Mesh" from ami as a base.
const mesh = new Mesh(); // it uses current "Mesh" as a base.
// IDs will conflict...

一種可行的解決方案是,我在ami構造函數中提供了一個新參數,以提供three參考:

// in ami
class Foo {
  contructor(mesh) {
    ...
  }
}

// in my app
imoport {Mesh} from 'three';
import {Foo} from 'ami';

const foo = new Foo(Mesh);
const mesh = new Mesh();

但是我不知道如何實現這個解決方案。

該答案解決了最初提出的問題,並且足以幫助OP完善問題並立即獲得投票。 如果您不僅僅因為球門柱已經移動而對它進行投票,我將不勝感激。

假設您並不瘋狂,並且這是一個學習練習,則學習如何實現此方法的最佳方法是獲取Typescript,使用擴展編寫類,以ES5為目標對其進行編譯並查看生成的JavaScript。 確保您的基類具有方法,屬性,靜態方法,靜態屬性以及帶有必需和可選參數混合的構造函數。 然后從中派生另一個類,並覆蓋一些方法並替換一些方法。 您會看到認真對待它的人如何完成它。

暫無
暫無

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

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