Nonconstructors
Tab Atkins Jr.
jackalmage at gmail.com
Fri Apr 28 21:27:20 UTC 2017
On Mon, Apr 24, 2017 at 10:53 PM, Raul-Sebastian Mihăilă
<raul.mihaila at gmail.com> wrote:
> On Tue, Apr 25, 2017 at 12:15 AM, Tab Atkins Jr. <jackalmage at gmail.com>
> wrote:
>>
>>
>> The obvious question is, why do you want to use `this`?
>>
>> ~TJ
>
>
>
> For cases such as a debounce function:
>
> ```js
> const debounce = (func, delay) => {
> let timeout;
>
> return function (...args) {
> clearTimeout(timeout);
>
> timeout = setTimeout(() => {
> func.apply(this, args);
> }, delay);
> };
> };
> ```
>
> If func is using `this` the resulted function (returned by `debounce`)
> should pass its `this`.
> Another case is related to form fields. Let's say a form field is an object
> with a `validate` method. I provide a `createValidator` function to the user
> that accepts multiple functions in order to call them 1 by 1 until one of
> them returns an error. The result of `createValidator` is a function that
> then becomes the value of the field's `validate` method (which the user will
> call in order to validate the field). So the function will want to use
> `this` because it will forward it to the functions provided by the user.
> This is expected because the function will be called as a method of the
> field object.
Ah, these use-cases are reasonable.
In that case, then, yeah, checking `new.target` seems to be the way
you want to go. That's explicitly what it was defined to do:
if(new.target) throw "Foo() must not be called with new";
There's no shorter way to do this; all the shorter methods rely on the
function clearly existing as a method, syntactically.
~TJ
More information about the es-discuss
mailing list