forms icon indicating copy to clipboard operation
forms copied to clipboard

Make create return an instance with prototype

Open JoeChapman opened this issue 11 years ago • 7 comments

I want to override the handle function returned when create is called. However, I cannot do so because there is not way to get at the definition. How would you feel about a PR that made create return an instance with handle on the prototype?

JoeChapman avatar Jun 16 '14 10:06 JoeChapman

Can you explain more of your use case? I'm pretty strongly biased against "new" and would prefer to avoid that approach, but maybe we can find another way to achieve what you need.

ljharb avatar Jun 16 '14 16:06 ljharb

Hi, I would like to be able to override the handle function in order to write a default set of rules for handling errors and success so I don't have to write the same patterns each time.

I can rewrite handle, but only on the form I have created, not on all forms I create from the form 'class'. If form.create returned an instance of a 'class', with 'handle' a prototype of that class, I could partially override the definition of handle.

You would not need to expose the uninstantiated constructor to the consumer of the interface, create could return a new instance.

JoeChapman avatar Jun 16 '14 16:06 JoeChapman

could you write a function like:

var formCreate = function () {
  var form = forms.create.apply(forms, arguments);
  form.handle = myHandle;
  return form;
};

ljharb avatar Jun 16 '14 17:06 ljharb

would that allow me to call the original handle function from within myHandle?

JoeChapman avatar Jun 16 '14 17:06 JoeChapman

Sure, you could do:

var formCreate = function () {
  var form = forms.create.apply(forms, arguments);
  var origHandle = form.handle;
  form.handle = function () {
    myHandle.call(this, arguments);
    return origHandle.call(this, arguments);
  };
  return form;
};

ljharb avatar Jun 16 '14 19:06 ljharb

However, it becomes a little awkward when I start separating code into modules because I want to export forms with a new definition of create, not a form object, as above.

JoeChapman avatar Jun 17 '14 11:06 JoeChapman

You could make a new module joe-forms that takes forms, saves a reference to the original create function, makes a formCreate like the example above and sticks that on .create, and then use joe-forms instead of forms.

ljharb avatar Jul 05 '14 21:07 ljharb