Как насчет:
//deleted constructor
class Foo
{
public:
Foo() = delete;
public:
static void foo();
};
void Foo::foo()
{
Foo f; //illegal
}
против
//private constructor
class Foo
{
private:
Foo() {}
public:
static void foo();
};
void Foo::foo()
{
Foo f; //legal
}
Они в основном разные вещи. private
сообщает вам, что только члены класса могут вызывать этот метод или обращаться к этой переменной (или, конечно же, к друзьям). В этом случае для метода static
этого класса (или любого другого члена) является законным конструктором класса private
. Это не выполняется для удаленных конструкторов.
Пример здесь .
Хотя существуют некоторые основательные ответы, я думал, что совместно использую свой подход. Я предпочитаю использовать функциональный подход с помощью Функтора. Функтор является просто необычным способом сказать, что мы будем передавать функцию значению. (Предположения, что я видел, передают значения функции)
, Создают помощника TypeOf
const TypeOf = obj => Object.prototype.toString.call(obj).slice(8,-1);
, Это подобно typeof, но теперь возвращается Array
для []
и Object
для {}
. Мне нравится думать о нем как о строгом typeof. Если Вы работаете над приложением Gmail, и производительность является беспокойством тогда, можно сделать что-то вроде этого.
const TypeOf = obj => (
Array.isArray(obj)
? "array"
: obj === null // catch null edge case. typeof null is an object :)
? null
: typeof obj
)
Вы могли остановиться здесь и прекратить дело, однако Вы могли сделать это немного более мощным составом использования. Вы извлекаете большую пользу при создании Функтора TypeBox, снова необычное слово для передачи функции к значению вместо того, чтобы передать значение функции.
Создают TypeBox
const TypeBox = (predicate, defaultValue) => {
const TypePredicate = value => ({
value,
map: cb => predicate(value)
? TypePredicate(cb(value))
: TypePredicate(defaultValue)
});
return TypePredicate;
}
здесь существует большое продолжение, но это очень мощно. Функция TypeBox использует закрытие и возвращает наш Функтор. Закрытия предоставляют Вам доступ к Lexical_Scope, думают о нем как о рюкзаке, который содержит вещи, к которым Вы хотите получить доступ позже.
Создают ArrayBox
const ArrayBox = TypeOf(obj => TypeOf(obj) === 'Array' ? obj : [obj]);
ArrayBox, передает наш predicate
и defaultValue
к [1 112] и будет доступен, когда мы вызываем/выполняем ArrayBox
(назовите его, вообще имеет смысл для Вашего варианта использования).
Теперь забавная часть
, Если входом является Массив, возвращает его.
ArrayBox(["foo", "bar"]).value; // ['foo', 'bar']
, Если вход не является массивом, возвратите его в одном
ArrayBox("foo").value // ["foo"]
, Что является большим об этом подходе, то, что он масштабируется, легко протестировать, и он использует состав. Можно составить функции любым способом для получения желаемого результата.
существует много других способов, которыми мы могли приблизиться к этому использованию Или или Монады.
сначала можно проверить console.log (typeof Объект)
, если вывод является объектом затем var {данные} =object т.е. просто destructure объект согласно объектным ключам. и функция может быть похожей на это.
const abc=(str1,str2=null)=>{
var result=[];
result.push(str1);result.push(str2);
return result.join("");
}