Зачем использовать apply () или call (), когда вы можете передать целевой объект в качестве параметра? - PullRequest
0 голосов
/ 09 марта 2020

Я понимаю варианты использования apply () и call (). По сути, вы можете вызвать функцию из другого объекта и указать привязку this. Это, конечно, имеет смысл, только если указанная функция использует ключевое слово this.

Я не понимаю, зачем вам создавать функцию внутри объекта, а затем решать, что вы хотите использовать ее где-то еще еще, изменив это? Для меня это звучит так, как будто функция имела смысл в первом объекте, и вместо рефакторинга функции, чтобы жить самостоятельно, программист решил просто оставить ее там и вызвать ее с помощью apply / call.

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

Я что-то упустил?

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Я могу привести один пример, где это полезно. Долгое время, за go до ES6, добиться наследования javascript было немного сложнее - было два типа наследования. Таким образом, чтобы создать один класс и наследовать его с другим классом, вы должны были сделать что-то вроде этого:

function Parent(){
   this.parentParam="parentParam";
};

Parent.prototype.logThisContext = function(){ 
   console.log(this);
};

function Child(){
   Parent.call(this);
};

Child.prototype = Object.create(Parent.prototype);

Теперь, если вы хотите переопределить родительскую функцию logThisContext, вы должны написать это:

Child.prototype.logThisContext = function(){
   // calling base functionality
   Parent.prototype.logThisContext.call(this);
   // add child functionality
   console.log("overriden behavior");
}

Если вы не вызовете logThisContext с this, вы запишете сам прототип вместо конкретного экземпляра.

Вы можете поиграть с этим кодом, удалив вызов this и вы сами увидите разницу :)

РЕДАКТИРОВАТЬ: Я не уверен, дает ли это вам ответ, который вы хотите, но технически функция logThisContext внутри объекта, как вы упомянули в своем ответе.

0 голосов
/ 09 марта 2020

Так вы скорее хотите String.toUpperCase("aa") вместо "aa".toUpperCase()?

Это в основном означало бы, что вы голосуете против любых методов экземпляра, обращающихся к объекту, к которому они обращаются.

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

Это было бы огромным шагом назад, imo, и приводят к путанице вложенных вызовов функций:

Вместо, например,

'abcdef'.toUpperCase().split('').join('.')

вам придется сделать

String.join(
  String.split(
    String.toUpperCase('abcdef'),
    ''
  ),
  '-'
);
...