在 JS 中,您可以从 class 继承方法并从父 class 的实例继承属性吗?

In JS can you inherit methods from your class and properties from an instance of your parent class?

在构建订单跟踪软件时,我想要一个看起来像这样的继承结构

      Default SKU Propreties
              |
        ----------...
        |
    SKU 001
        |
   --------...
   |
Item AAA

我希望 Item 对象继承其父 SKU 对象的属性和方法,但也有特定于 Item 对象的方法。

我尝试过 Class Item extends SKU 之类的方法,但当然这只会使 SKU class 成为 Item 实例的祖先,而不是具有相关属性的 SKU 实例。我知道你可以做类似 itemInstance = Object.create(skuInstance) 的事情来继承 SKU 实例对象,但是 itemInstance 没有得到在项目 class.

上定义的任何方法

感谢您的帮助:)

编辑,附加信息:

我希望 SKU 实例具有一些属性和方法,例如:

SKU 001
Name: 'Custom T-Shirt'
getLaborCost()

我希望每个 Item 实例都继承该 SKU 下所有 Item 的通用值。我希望它也具有像 proofs 这样的属性,每个 Item 实例都是唯一的。

现在我通过让“项目”对象实例将 SKU 实例作为它们的原型来实现这一点。原型祖先看起来像这样:

SKU Class (with methods)
v
SKU instance (with properties)
v
"item" instance (with properties)

但是,这意味着我不能让项目成为项目 class 的实际实例并获得像 attachProof() 这样的独特方法,我不希望它在 SKU 实例对象上可用.

来自我对 MikeM 的评论: “我希望用户在程序执行期间能够更改 skuInstance.name 并且它的所有项目都将其 itemInstance.name 解析为当前值。我还希望用户能够覆盖某些项目实例否则将被继承的属性。"

下面是一个示例,说明您可以如何在不使用继承的情况下满足您的要求。

请注意,属性 也指方法,因为方法是属性,其值是一个函数。

有关使用 Object.assign 的一些注意事项,请参阅 MDN

class Item {
  #sku;
  constructor(props) {
    const { sku, ...others } = props; 
    Object.assign(this, others);
    this.#sku = sku;
  }
  get name() { return this.#sku?.name }
  set name(val) { /* disallow */ }
  // Add further properties of all Item instances...
}

class SKU {
  #itemProps;
  constructor(props) { 
    const { itemProps, ...others } = props; 
    Object.assign(this, others);
    this.#itemProps = itemProps;
  }  
  item(props) {
    return new Item({ ...this.#itemProps, ...props, sku: this });
  }
  // Add further properties of all SKU instances...
}

let sku1 = new SKU({ name: 'Custom T-Shirt', itemProps: { color: 'red' } });
let item1 = sku1.item({ size: 'L' });

console.log(item1.name);      // "Custom T-Shirt"
sku1.name = 'Slogan T-Shirt';
console.log(item1.name);      // "Slogan T-Shirt"
console.log(item1.color);     // "red"
console.log(item1.size);      // "L"