在 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"
在构建订单跟踪软件时,我想要一个看起来像这样的继承结构
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"