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

#javascript

Вопрос:

Мне нужна функция, которая принимает строку в качестве параметра и преобразует ее в нижний регистр в JS.

Я мог бы добиться этого, написав обертку сверху toLowerCase вот так

 makeLowerCase(stringText){
 return stringText.toLowerCase();
}
 

Но мне было интересно, есть ли способ получить ссылку toLowerCase на сам метод, как показано ниже, чтобы я мог избежать написания оболочки.

 toLowerFn = String.prototype.toLowerCase
toLowerFn('AAA') // throws error - Uncaught TypeError: String.prototype.toLowerCase called on null or undefined
 

Я знаю, что в python мы можем получить ссылку на функцию lower (), используя str.lower и передавая ее в любое место.

Есть идеи, можно ли сделать то же самое в JS?

Комментарии:

1. Зачем вам нужно это делать вместо вызова variable.toLowerCase() или функции, которая это делает ? В этом вообще нет никакого смысла… вы не используете Javascript подобным образом… это не python… Вы добавляете сложности…

2. @matiaslauriti возможно, что OP захочет передать это где-нибудь в качестве ссылки на функцию, например, arr.map(toLower) что было бы правильным использованием в JS. К сожалению, toLowerCase это метод, который делает его довольно раздражающим для передачи в качестве ссылки.

3. Ну, я никогда этого не видел, это кажется сложным без всякой причины, просто звоните variable.toLowerCase() , не нужно делать сложные вещи, потому что они взяты из других языков…

4. @matiaslauriti в данном случае это JS, который сложнее, чем это должно быть. Существуют предложения, направленные на решение проблем, связанных с привязкой методов. Прямо сейчас, к сожалению, у нас ничего нет. И это прискорбно, так как передача ссылок на функции лежит в основе JS — str.split("").map(Number) например, или arr.filter(Boolean) является идиоматическим кодом JS. Как и должно быть total = shoppingBasketArr.map(getPrice).map(addShipping).reduce(sum) . Тем не менее, мы не можем легко сделать это со ссылками на методы.


Ответ №1:

Вы можете это сделать, если вы Function#bind Function#call используете в String#toLowerCase качестве this контекста:

 const str = "HELLO";

const toLower = Function.prototype.call.bind(String.prototype.toLowerCase);

console.log(toLower(str)); 

Но я бы не рекомендовал это делать, так как это выглядит странно и сбивает с толку. Я бы просто написал обертку:

 const str = "HELLO";

const toLower = s => s.toLowerCase();

console.log(toLower(str)); 

Ответ №2:

 const foo = 'FOO';
console.log(foo.toLowerCase()); 

Комментарии:

1.Как это соотносится toLowerCase ?