Известно, что в JS вы можете создать функцию внутри функции, например:

function digit() { return 9 };
digit.five = function() { return 5 };

digit();     // 9
digit.five() // 5

Я не знаю, является ли это плохой практикой или нет (возможно, так и есть) - поскольку она работает правильно, вы можете ее использовать.

Но что, если бы у нас была функция digit() в качестве метода некоторого объекта (см. Пример ниже)?
Тогда как бы мы объявили digit.five()? Предполагается, что мы хотим объявить это в рамках obj.

var obj = {
    digit: function() { return 9 },
 // digit.five: … ???
 // digit["five"]: … ???
}

obj.digit();     // 9
obj.digit.five() // 5

Возможно ли это вообще без создания нового метода obj.digitFive()?


PS: пользователь nnnnnn здесь говорит, чтобы мы могли создать атрибут внутри obj.digit():

var obj = {
    digit: function () {
        return 9;
        obj.digit.five = function () { return 5 };
    }
}

Это единственный способ сделать это?

3
Dima Parzhitsky 19 Дек 2015 в 06:52

3 ответа

Лучший ответ

Нет встроенного синтаксиса для добавления свойств в выражения функций, нет. Вы можете добавить свойство впоследствии:

var obj = {
    digit: function() { return 9 },
};

obj.digit.five = function() { return 5 };

Стандартная функция ES6 Object.assign тоже хорошо работает:

var obj = {
    digit: Object.assign(
        function() { return 9 },
        { five: function() { return 5 } }
    ),
};
3
Ry- 19 Дек 2015 в 03:56

Не уверен, что ответ на ваш вопрос, но вы могли бы сделать это:

var obj = {
    digit: function() { return 9 },
 // digit.five: … ???
 // digit["five"]: … ???
}

obj.digit.five = function(){ return 5 }; 

obj.digit();     // 9
obj.digit.five() // 5
2
greenish 19 Дек 2015 в 03:56

Помните - в JS функции есть объекты :)

Таким образом, чтобы создать атрибут obj.digit.five, вы должны сначала объявить атрибут obj.digit (это может быть что угодно, но не обязательно должен быть определенным объектом), а затем вы можете добавить ключи к этому атрибуту.

Проблема в том, что если вы попытаетесь создать obj.digit.five, не создавая obj.digit, вы получите ошибку «unefined».

Помните, что создание digit, как в первом примере, создает анонимную функцию и назначает ее для клавиши digit. Вы можете попробовать другое решение и создать эту функцию на стороне, как:

var digit = function() {...};
digit.five = function() {...};
digit.otherproperty = 3;

А затем назначьте все свойства / функции / и т.д. к нему, а затем назначить эту созданную переменную obj, как:

obj.digit = digit;
0
SzybkiSasza 19 Дек 2015 в 04:02