Я знаю, как установить внутри него свойство класса: 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
}
}
}
@Addison Да, работает, как и Test.property = 1;. Может кто объяснит разницу и что лучше
Тогда непонятно, чего вы пытаетесь достичь. Test.property и this.property - это яблоки и апельсины. Вы хотите установить экземпляр или статическое свойство?
Я только что нашел эту страницу, объясняющую различные обходные пути для этой проблемы: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…. На это определенно стоит посмотреть. Из прочтения этого раздела похоже, что использование строгого режима также решает эту проблему (хотя мне все еще нравится ответ @estus, поскольку он выглядит лучше и не полагается на знание того, где будет работать js).





Это то, для чего нужны стрелочные функции, они обеспечивают лексическое значение this в области видимости функции.
request(options, (err, res, body) => {
this.property = 1
})
Также побочные эффекты в конструкторе класса - это антипаттерн, особенно асинхронный.
Спасибо за ответ. Именно то, что я искал. Об асинхронных функциях внутри конструктора. Что мне делать, если я хочу сделать запрос после звонка new Test()?
У меня обычно есть явный метод класса, такой как fetch, и я вызываю его явно. Даже если это выполняется в конструкторе, рекомендуется иметь параметр обратного вызова в конструкторе, чтобы можно было уведомить код вне класса о завершении инициализации. Но когда вы переключаетесь с обратных вызовов на обещания (я бы рекомендовал сделать это как можно скорее), становится очевидно, что отдельный метод fetch работает лучше.
Спасибо еще раз. Вы определенно помогли.
"это" - ключевое слово. Это относится к объекту. "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
Я плохо разбираюсь в js, поэтому это, вероятно, не лучшее решение, но я почти уверен, что вы могли бы сделать что-то вроде
const self = this;вне своей анонимной функции, а затем установить его с помощьюself.property = 1;, находясь внутри функции.