Объявить переменную функцией и иметь свойства в одном выражении

Можно ли объединить в одно утверждение следующее:

// Combine from here

const foo = function() {
    return 'hello';
}
foo.world = 'world';

// to here

console.info(foo() + foo.world) // helloworld

Я предполагаю, что ваш вопрос подразумевает, что console.info(foo() + foo.world) неизменен?

Tyler Roper 10.06.2019 20:28

Мне только любопытно, можно ли комбинировать приведенные выше утверждения. Меня не волнует console.info....

Bradd 10.06.2019 20:30

Я понимаю это, но console.info — это единственное, что у вас есть, чтобы определить ваши ограничения. Непонятно, какова ваша конечная цель. Я не уверен, как далеко я могу зайти, манипулируя вашей функцией. Может ли это быть функцией-конструктором? new foo()? Класс?

Tyler Roper 10.06.2019 20:30

Пока я могу звонить foo() и у него есть недвижимость foo.world меня все устраивает. Мне просто любопытно, смогу ли я сделать это за один шаг или мне нужна фабрика для создания этих объектов.

Bradd 10.06.2019 20:34

что-то вроде const foo = Object.assign(function() { return 'hello'; }, { world: 'world' })? или foo.world = 'world'; может быть внутри функции

Slai 10.06.2019 20:38

@Slai, это работает! Не могу поверить, что я не подумал об этом. Это все еще фабрика, но, по крайней мере, это ванильная острота.

Bradd 10.06.2019 20:41
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
58
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

(foo = () => 'hello').world = 'world'

запустив это в консоли Chrome. foo() миры, но foo.world не определено.

Bradd 10.06.2019 20:38

@Bradd извините, я сделал правку, теперь foo.world определен

de3 10.06.2019 20:39

теперь это работает, но возможно ли сделать это с несколькими свойствами?

Bradd 10.06.2019 20:44

Вы можете использовать defineProperties: Object.defineProperties((foo = () => 'hello'), {world: {value:'world'}, Universe: {value:'universe'}})

de3 11.06.2019 00:20

Вы должны назначить static вне объявления функции/класса. Вот альтернативная версия ES5, использующая классы.

class foo {
  constructor() {
    // constructor...
  }
  toString() {
    return 'hello'
  }
}
foo.world = 'world' // static member variables need to be assigned outside, no other way

console.info(new foo() + foo.world) // helloworld

"статику нужно назначать снаружи, иначе никак" - думаю, был ответ на мой вопрос. Похоже, что я бы также ограничился одним статическим за раз, верно?

Bradd 10.06.2019 20:39

Ну, я действительно имею в виду статические переменные-члены. Статические методы фактически разрешены. Вот предложение 2-летней давности по добавлению статический конструктор и статические переменные-члены в JavaScript.

Mr. Polywhirl 10.06.2019 20:41
Ответ принят как подходящий

Вы можете переместить объявление свойства в в функцию.

let foo = function () {
  foo.world = 'world';
  return 'hello';
};
  
console.info(foo() + foo.world)

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