Доступ к классу внутри его статических методов - PullRequest
0 голосов
/ 09 октября 2018

Я строю простую 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 голосов
/ 09 октября 2018

Вы не можете получить доступ к методу экземпляра, так как он был статическим.Это классическая ошибка.Единственный способ, которым вы можете использовать метод экземпляра внутри статического, - это если у вас есть экземпляр класса (отсюда и имя «метод экземпляра»).

Обычно вы допускаете такую ​​ошибку в своем решениичто должно быть статическим, а что нет ... не задумываясь, я могу просто предложить сделать метод generateModel статическим.Другой способ - полностью удалить метод generateModel и включить его поведение в конструктор.Это действительно зависит от ваших потребностей.

Просто помните, что если вы обращаетесь к нестатическому свойству внутри метода, то оно не должно быть статическим.

0 голосов
/ 09 октября 2018

Как получить доступ к методу класса или к тому же внутри статического метода класса?

Единственный способ получить доступ к информации об экземпляре из метода 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({}));
...