gpt4 book ai didi

javascript - 在类的静态方法中访问类

转载 作者:行者123 更新时间:2023-11-28 14:27:20 33 4
gpt4 key购买 nike

我正在构建一个简单的。我的问题是:

如何在静态类方法内访问类方法或 this

当尝试在 static 方法中访问 this 时,如下所示:

const { ProductsCollection } = require('../utils/Collection')
let modeledCollection = ProductsCollection.mapToModel(legacy)

我收到一个TypeError:this.generateModel 不是一个函数。这是我的类(class):

class ProductsCollection {
generateModel () {
let model = { name: 'testing' }
return model
}

static mapToModel (legacy) {
if (!isObject(legacy))
return legacy

let current = this.generateModel() // Here!!!
for (let key in legacy) {
// some code...
}
return current
}
}

module.exports = { ProductsCollection }

提前致谢!

最佳答案

How to access a class method, or this for that matter, inside a static class method?

static 访问实例信息的唯一方法方法是创建一个实例(或接收一个实例作为参数,或关闭一个实例[这会很奇怪],等等;例如,您需要一个实例)。这就是static的要点方法:它们不与类的实例关联,而是与构造函数关联。

您的generateModel如图所示,方法也不使用实例,因此将其设置为 static 可能是有意义的以及。然后你可以通过 this.generateModel 访问它(假设 mapToModel 通过 ProductsCollection.mapToModel 调用)或 ProductsCollection.generateModel (如果您不想做出这样的假设):

class ProductsCollection {
static generateModel() {
return {name: "testing"};
}

static mapToModel(legacy) {
return this.generateModel();
// or `return ProductsCollection.generateModel();` if you want to use
// `ProductsCollection` specifically and not be friendly
// to subclasses
}
}
console.log(ProductsCollection.mapToModel({}));

或者如果generateModel需要实例信息,您可以使用 new ProductsCollection (或 new this )在您的 mapToModel 中创建实例,然后访问generateModel在那个例子中。

class ProductsCollection {
generateModel() {
return {name: "testing"};
}

static mapToModel(legacy) {
const instance = new this();
// or `const instance = new ProductsCollection();` if you want
// to use `ProductsCollection` specifically and not be friendly
// to subclasses
return instance.generateModel();
}
}
console.log(ProductsCollection.mapToModel({}));

关于javascript - 在类的静态方法中访问类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52717881/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com