在其静态方法内访问类

时间:2018-10-09 09:40:51

标签: javascript typeerror es6-class

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

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

当尝试像这样在this方法内访问static时:

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

我收到 TypeError this.generateModel is not a function。这是我的课程:

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 }

谢谢!

2 个答案:

答案 0 :(得分:2)

  

如何在静态类方法内部访问类方法?

Number = input("write your number: ") if isinstance(Number, int): print('Number is Integer') elif (Number).is_integer(): print('Number is Integer') else: print("Number is Float") 方法访问实例信息的唯一方法是创建一个实例(或接收一个实例作为参数,或关闭一个实例(这很奇怪),等等;例如,您需要一个实例)。这是Sample Table: A B C 0 False True False 1 False False False 2 True True False 3 True True True 4 False True False 5 True True True 6 True False False 7 True False True 8 False True True 9 True False False 方法的重点:它们与类的实例无关,而与构造函数相关。

如图所示,您的length = [3, 4, 2] 方法也不使用该实例,因此也可以将其设为index = [5, 2, 7] 。然后,您可以通过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

答案 1 :(得分:2)

您无法访问实例方法,因为它是静态方法。这是一个经典的错误。在静态实例中使用实例方法的唯一方法是,如果有可用的类的实例(因此称为“实例方法”)。

通常,您在决定什么应该是静态的以及什么不是静态的方面犯了很多错误……我不费吹灰之力就建议将generateModel方法设为静态。另一种方法是完全删除generateModel方法并将其行为合并到构造函数中。这实际上取决于您的需求。

请记住,如果要在方法内部访问非静态属性,则该属性应该不是静态的。