javascript инициализация свойств объекта

104
17 апреля 2021, 06:40

Есть объект:

var Auth = {
    submit_counter: 0,
    $login_field: "",
    $passwd_field: "",
    Submit: function()
    {
        //do some stuff
    }
}

Хотелось бы (и где-то видел, в каких-то плагинах, нагуглить к сожалению не удалось) инициализировать свойства более красиво, грамотно и лаконично, нежели каждый раз писать Auth.$login_field = ..., Auth.$passwd_field = ... и т.п.

Должно же быть какое-то решение, вроде такого

Auth({
    $login_field: "var",
    $passwd_field: "var"
});

Пробовал через создание экземпляра объекта new, но возникает ошибка:

TypeError: Object is not a constructor (evaluating 'new Auth')

Подскажите, как правильно?

Answer 1

То что вы ищите - это Object.assign()

var object = {}; 
 
Object.assign(object, { 
    $login_field: "var", 
    $passwd_field: "var" 
}) 
 
console.log(object)

Так же есть Object.defineProperties(), им можно определить не только значения самих свойств но настраивать их поведение

var object = {}; 
 
Object.defineProperties(object, { 
  '$login_field': { 
    value: "var", 
    writable: true, 
    enumerable: true 
  }, 
  '$passwd_field': { 
    value: "var", 
    writable: false, 
    enumerable: true 
  } 
}); 
 
object['$login_field'] = "val" 
object['$passwd_field'] = "val" 
 
console.log(JSON.stringify(object))

Цитата из MDN о значении свойств второго аргумента props:

configurable

Равен true только в том случае, если тип этого дескриптора свойства может быть изменён и если свойство может быть удалено из содержащего его объекта. Значение по умолчанию установлено в false.

enumerable

Равен true только в том случае, если это свойство можно увидеть через перечисление свойств содержащего его объекта. Значение по умолчанию установлено в false.

value

Значение, ассоциированное со свойством. Может быть любым допустимым значением JavaScript (числом, объектом, функцией и т.д.). Значение по умолчанию установлено в undefined.

writable

Равен true только в том случае, если значение, ассоциированное со свойством, может быть изменено с помощью оператора присваивания. Значение по умолчанию установлено в false.

get

Функция, используемая как геттер свойства, либо undefined, если свойство не имеет геттера. Возвращаемое значение функции будет использоваться как значение свойства. Значение по умолчанию установлено в undefined.

set

Функция, используемая как сеттер свойства, либо undefined, если свойство не имеет сеттера. Функция принимает единственным аргументом новое значение, присваиваемое свойству. Значение по умолчанию установлено в undefine

Answer 2

Для этого существуют классы:

class SomeObject { 
  constructor(sc = 0, lf = '', pf = '') { 
    this.submit_counter = sc; 
    this.$login_field = lf; 
    this.$passwd_field = pf; 
  } 
 
  Submit(n) { 
    console.log(`submit on ${n}`); 
  } 
} 
 
let obj1 = new SomeObject(); 
let obj2 = new SomeObject(10, 'Rusic', 'password'); 
 
console.log({ 
  obj1, 
  obj2 
}); 
 
obj1.Submit('obj1'); 
obj2.Submit('obj2');

READ ALSO
Почему не настраивается компиляция в нужную папку в liveSassCompile?

Почему не настраивается компиляция в нужную папку в liveSassCompile?

Пользуюсь VSCode плагином "Live sass compile"Необходимо настроить компиляцию SASS в прошлую папку, делаю это следующим образом:

108
gumbo-parser нужна помощь

gumbo-parser нужна помощь

С основными моментами я разобрался, но не могу понять как получить данные которые находятся между тегами

97
getchar() и буфер

getchar() и буфер

Проблема такая: при любом раскладе переменная getchar a возвращает '\n' и выполняет default (goto x), не учитывая остальноеКак можно исправить сие недоразумение?

115