当可以将目标对象作为参数传递时,为什么使用apply()或call()?

问题描述 投票:0回答:2

我了解使用apply()和call()的用例。您基本上可以从另一个对象调用一个函数,然后指定此绑定。当然,只有在所述函数使用this关键字时才有意义。

我不明白的是,为什么要在对象内部创建一个函数,然后通过更改此选项来决定要在其他地方重用它?对我来说,这听起来像是第一个对象中的函数有意义,并且程序员决定将其保留在那里,并通过apply / call对其进行调用,而不是重构该函数以独自生存。

对我来说,从该对象中删除该函数,并通过将目标对象作为显式参数,将其放置在其他对象可以清晰地看到的位置上,这对我来说更有意义。

我想念什么吗?

javascript this
2个回答
1
投票

我可以举一个有用的例子。很久以前,在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从技术上讲是您在答案中提到的对象内部的函数。


-2
投票

所以您宁愿要String.toUpperCase("aa")而不是"aa".toUpperCase()

这基本上意味着您要对访问它们被调用的对象的任何实例方法投反对票。

对我来说,从该对象中删除该函数,并通过将目标对象作为显式参数,将其放置在其他对象可以清晰地看到的位置上,这对我来说更有意义。

这将使imo向后退一步,并导致一堆嵌套函数调用:

而不是例如

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

您必须做

String.join(
  String.split(
    String.toUpperCase('abcdef'),
    ''
  ),
  '-'
);
© www.soinside.com 2019 - 2024. All rights reserved.