{
key1: 'test',
key2: {
'test2',
'test3',
get bar() {
return `${this.key1}$. {this.key2.test2}`
}
}
}
Вывод FOO.key2.bar выводит ошибку undefined
В чем может быть проблема?
Тут проблема в области видимости или другая причина?
А переменные test2 и test3 определены? Здесь используется короткая запись, где свойство test2 определяется значением переменной test2
Да, скорректировал, похоже уже понял. Дело всё таки в области видимости, он привязывается к области вложенного объекта
А, не увидел что там key, а не test. Да, только это не про область видимости, а про определение контекста. this, если явно не привязан - это объект у которого вызывается метод
А как-то можно получить доступ к свойству родительского объекта?)
Нет "родительского" объекта. Тут просто свойство, которое ссылается на другой объект. Но на него может ссылаться куча свойств в самых разных объектах одновременно. Можно просто обращаться не к this, а у FOO, либо явно биндить контекст
прототип можно у всех дочерних указывать на корневой
что такое get bar()?
действительно великий могучий javascript...
Их добавили ещё в ES5 и на них основана реактивность в Vue 2! :D
В прикладном программировани такого не часто встречал В других языках есть?
Начиная с es6 просто в таких случаях чаще используют классы, там те же геттеры и сеттеры
есть, тот же C# взять
так вью 2 на них чисто и работал .-.
во многих, тема стара как мир
И что там? Работаешь извне напрямую с переменной объекта, а под капотом вызываются определенные тобой методы?
Ну геттеры/сеттеры в классах там также есть. Вроде во всех ООП языках есть популярных
Мы говорим о разных вещах В нормальном мире объект - это набор свойств/аттрибутов и методов В JS тут идет смешение свойства и методов
Чем отличается "набор свойств и методов" от "смешение свойств и методов"?
в JS объекты это наборы дескрипторов
Геттеры и сеттеры в ООП языках это обычные методы Функции И обращение к ним идет как к методам
да нет в C#, Dephi это не так
То что ты вроде работаешь с примитивным свойством объекта, а на самом деле происходит непонятно что Вроде тут недавно переопределения функций Реактом ругиали
а где тут переопределение
public class Person { public string? FirstName { get { return _firstName; } set { _firstName = value; } } private string? _firstName; // Omitted for brevity. } hero.FirstName = "";
https://learn.microsoft.com/en-us/dotnet/csharp/properties
Аналогичное есть в пайтоне, котлине class Rectangle(val width: Int, val height: Int) { val area: Int get() = this.width * this.height } rectangleInstance.area //
В C# и Котлин - действительно В Питоне - нет, это обычные функции
class Foo: def __init__(self, number): self._number = number @property def str_number(self): return str(self._number) @str_number.setter def str_number(self, value): self._number = int(value)
Ужас... Чем больше узнаю языки программирования, тем больше люблю Java
Если я пишу foo.bar = 3, то я ожидаю что foo.bar = 3 Если у него стоит сеттер и другое поведение, то это переопределение и неправильно Потому что foo.bar = 3; console.log(foo.bar); // 5 это чушь
const a = ref() const b = {} a.value = b console.log(a.value === b) // false
> Потому что > foo.bar = 3; > console.log(foo.bar); // 5 Не нужно так использовать геттер/сеттер
Ну ссылочные типы и реактивность тут ни при чем абсолютно
Ну буквально та же проблема, я присвоил в свойство значение (не вызывал же метод setValue()), беру значение того же свойства и там что-то другое. И норм, никакой чуши. Проблема не в геттерах/сеттерах, а в том как их используют. modelValue Proxy - тоже чушь?
нууууу если ты науршщаешь контракт то да
Если ты используешь сеттер то всегда может возникнуть аналогичная ситуацию При вызове явно функции ты получаешь результат, исключение и много других возможностей контроля кода
Обсуждают сегодня