Как получить доступ к свойству класса по умолчанию из объекта? - PullRequest
4 голосов
/ 15 марта 2020

У меня следующий вызов, который мне не удался. И я не смог найти пример кого-то, кто столкнулся с той же проблемой.

class MyClass {
    name = 'default name'
}

let instance = new MyClass();
instance.name = 'new name';

# At this point I want to be able to access the default 'name' of my class (value: 'default name')

Мне интересно, как лучше к этому подойти.

Ответы [ 3 ]

3 голосов
/ 15 марта 2020

Как уже упоминалось в других ответах, прямого пути нет, вам нужно создать новый экземпляр.

Однако, если вам это нужно чаще, вы можете создать экземпляр один раз и использовать его повторно. :

class MyClass {
  name = 'default name'
}

MyClass.prototype.defaults = Object.freeze(new MyClass())

// ------------

let instance = new MyClass()
instance.name = 'new name'
console.log(instance.name) // new name
console.log(instance.defaults.name) // default name

Я дополнительно использую Object.freeze для предотвращения случайного изменения экземпляра по умолчанию.

Вы также можете назначить MyClass.defaults, но тогда вам придется использовать instance.constructor.defaults.name или MyClass.defaults.name.

2 голосов
/ 15 марта 2020

Учитывая код в вопросе точно , это невозможно, если вы не создадите новый экземпляр. С

name = 'default name'

вы присваиваете свойству name объекта экземпляра. Затем с помощью

instance.name = 'new name';

вы перезаписываете свойство name объекта экземпляра. 'default name' больше не существует нигде в цепочке прототипов.

Итак, создайте новый экземпляр, чтобы снова запустить поле класса:

class MyClass {
    name = 'default name'
}

let instance = new MyClass();
instance.name = 'new name';

const newInstance = new MyClass();
console.log(newInstance.name);

Лучшим вариантом было бы поместить значение по умолчанию в прототип . Таким образом, вы можете проверить свойство в прототипе или свойство в экземпляре:

class MyClass {
    
}
MyClass.prototype.name = 'default name';

let instance = new MyClass();
instance.name = 'new name';

console.log(instance.name);
console.log(MyClass.prototype.name);
2 голосов
/ 15 марта 2020

Вы можете создать новый временный экземпляр и получить имя

class MyClass {
    name = 'default name'
}

let instance = new MyClass();
instance.name = 'new name';

console.log((new MyClass()).name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...