Установить свойство класса внутри функции

Я знаю, как установить внутри него свойство класса: this.property = 1.

Но что мне делать, если это внутри функции? Пример:

class Test = {
    constructor(){
        var request = require('request');
        request(options, function(err, res, body){
            // Here I want to set Test property
            // Something like this.property = 1 or 
            // Test.property = 1
        }
    }
}

Я плохо разбираюсь в js, поэтому это, вероятно, не лучшее решение, но я почти уверен, что вы могли бы сделать что-то вроде const self = this; вне своей анонимной функции, а затем установить его с помощью self.property = 1;, находясь внутри функции.

Addison 09.11.2018 07:05

@Addison Да, работает, как и Test.property = 1;. Может кто объяснит разницу и что лучше

Tryam 09.11.2018 07:17

Тогда непонятно, чего вы пытаетесь достичь. Test.property и this.property - это яблоки и апельсины. Вы хотите установить экземпляр или статическое свойство?

Estus Flask 09.11.2018 07:20

Я только что нашел эту страницу, объясняющую различные обходные пути для этой проблемы: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…. На это определенно стоит посмотреть. Из прочтения этого раздела похоже, что использование строгого режима также решает эту проблему (хотя мне все еще нравится ответ @estus, поскольку он выглядит лучше и не полагается на знание того, где будет работать js).

Addison 13.12.2018 21:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
994
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это то, для чего нужны стрелочные функции, они обеспечивают лексическое значение this в области видимости функции.

request(options, (err, res, body) => {
    this.property = 1
})

Также побочные эффекты в конструкторе класса - это антипаттерн, особенно асинхронный.

Спасибо за ответ. Именно то, что я искал. Об асинхронных функциях внутри конструктора. Что мне делать, если я хочу сделать запрос после звонка new Test()?

Tryam 09.11.2018 07:24

У меня обычно есть явный метод класса, такой как fetch, и я вызываю его явно. Даже если это выполняется в конструкторе, рекомендуется иметь параметр обратного вызова в конструкторе, чтобы можно было уведомить код вне класса о завершении инициализации. Но когда вы переключаетесь с обратных вызовов на обещания (я бы рекомендовал сделать это как можно скорее), становится очевидно, что отдельный метод fetch работает лучше.

Estus Flask 09.11.2018 07:29

Спасибо еще раз. Вы определенно помогли.

Tryam 09.11.2018 07:33

"это" - ключевое слово. Это относится к объекту. "this.someProperty" означает свойство someProperty соответствующего объекта.

Test - это имя класса. Test.property - это просто неправильный способ обратиться к свойству объекта.

Как отмечалось выше, правильный способ обратиться к свойству из функции - использовать стрелочную функцию.

class Test = {
  constructor(){
    var request = require('request');
    request(options, (err, res, body)=>{
        this.property = 1
    })
  }
}

var aTest = new Test();  // a Test object
var anotherTest = new Test(); // another Test object

// Change the property value of the objects
aTest.property = 5
anotherTest.property = 10

Другие вопросы по теме