Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6682683
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 26, 20262026-05-26T04:44:05+00:00 2026-05-26T04:44:05+00:00

// Don’t break the function prototype. // pd – https://github.com/Raynos/pd var proto = Object.create(Function.prototype,

  • 0
// Don't break the function prototype.
// pd - https://github.com/Raynos/pd
var proto = Object.create(Function.prototype, pd({
  "prop": 42
}));

var f = function() { return "is a function"; };
f.__proto__ = proto;

console.log(f.hasOwnProperty("prop")); // false
console.log(f.prop); // 42
console.log(f()); // "is a function"

.__proto__ is non-standard and deprecated.

How am I supposed to inherit prototypically creating an object but having that object be a function.

Object.create returns an Object not a Function.

new Constructor returns an Object not a Function.

Motivation: – A cross-browser finherit

var finherit = function (parent, child) {
    var f = function() { 
        parent.apply(this, arguments);
        child.apply(this, arguments);
    };
    f.__proto__ = parent;
    Object.keys(child).forEach(function _copy(key) {
        f[key] = child[key];
    });
    return f;
};

I don’t believe this is possible, so we should probably propose a Function.create to the es-discuss mailing list

/*
  Creates a new function whose prototype is proto.
  The function body is the same as the function fbody.
  The hash of propertydescriptors props is passed to defineproperties just like
  Object.create does.
*/
Function.create = (function() {
  var functionBody = function _getFunctionBody(f) {
    return f.toString().replace(/.+\{/, "").replace(/\}$/, "");
  };
  var letters = "abcdefghijklmnopqrstuvwxyz".split("");

  return function _create(proto, fbody, props) {
    var parameters = letters.slice(0, fbody.length);
    parameters.push(functionBody(fbody));
    var f = Function.apply(this, parameters);
    f.__proto__ = proto;
    Object.defineProperties(f, props);
    return f;
  };
})();

Related es-discuss mail

As mentioned in the es-discuss thread there exists a ES:strawman <| prototype operator which would allow for this.

Let’s see what it would look like using <|

var f1 = function () {
  console.log("do things");
};

f1.method = function() { return 42; };

var f2 = f1 <| function () {
  super();
  console.log("do more things");
}
console.log(f1.isPrototypeOf(f2)); // true
console.log(f2()); // do things do more things
console.log(f2.hasOwnProperty("method")); // false
console.log(f2.method()); // 42
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-26T04:44:05+00:00Added an answer on May 26, 2026 at 4:44 am

    I hope that I’m understanding this right.

    I believe you want a functor that’s both an instance of a predefined prototype (yes, a class, just not a classic class) as well as directly callable? Right? If so, then this makes perfect sense and is very powerful and flexible (especially in a highly asynchronous environment like JavaScript). Sadly there is no way to do it elegantly in JavaScript without manipulating __proto__. You can do it by factoring out an anonymous function and copying all of the references to all of the methods (which seems to be the direction you were heading) to act as a proxy class. The downsides to this are…

    1. It’s very costly in terms of runtime.
    2. (functorObj instanceof MyClass) will never be true.
    3. Properties will not be directly accessible (if they were all assigned by reference this would be a different story, but primitives are assigned by value). This can be solved with accessors via defineProperty or simply named accessor methods if necessary (it appears that that is what you’re looking for, just add all properties to the functor with defineProperty via getters/setters instead of just functions if you don’t need cross-engine support/backwards compatability).
    4. You’re likely to run into edge cases where final native prototypes (like Object.prototype or Array.prototype [if you’re inheriting that]) may not function as expected.
    5. Calling functorObj(someArg) will always make the this context be the object, regardless of if it’s called functorObj.call(someOtherObj, someArg) (this is not the case for method calls though)
    6. Because the functor object is created at request time, it will be locked in time and manipulating the initial prototype will not affect the allocated functor objects like a normal object would be affected (modifying MyClass.prototype will not affect any functor objects and the reverse is true as well).

    If you use it gently though, none of this should be a big deal.

    In your prototype of your class define something like…

    // This is you're emulated "overloaded" call() operator.
    MyClass.prototype.execute = function() {
       alert('I have been called like a function but have (semi-)proper access to this!');
    };
    
    MyClass.prototype.asFunctor = function(/* templateFunction */) {
       if ((typeof arguments[0] !== 'function') && (typeof this.execute !== 'function'))
          throw new TypeError('You really should define the calling operator for a functor shouldn\'t you?');
       // This is both the resulting functor proxy object as well as the proxy call function
       var res = function() {
          var ret;
          if (res.templateFunction !== null)
             // the this context here could be res.asObject, or res, or whatever your goal is here
             ret = res.templateFunction.call(this, arguments);
          if (typeof res.asObject.execute === 'function')
             ret = res.asObject.execute.apply(res.asObject, arguments);
          return ret;
       };
       res.asObject = this;
       res.templateFunction = (typeof arguments[0] === 'function') ? arguments[0] : null;
       for (var k in this) {
          if (typeof this[k] === 'function') {
             res[k] = (function(reference) {
                var m = function() {
                   return m.proxyReference.apply((this === res) ? res.asObject : this, arguments);
                };
                m.proxyReference = reference;
                return m;
             })(this.asObject[k]);
          }
       }
       return res;
    };
    

    Resulting usage would look something like…

    var aobj = new MyClass();
    var afunctor = aobj.asFunctor();
    aobj.someMethodOfMine(); // << works
    afunctor.someMethodOfMine(); // << works exactly like the previous call (including the this context).
    afunctor('hello'); // << works by calling aobj.execute('hello');
    
    (aobj instanceof MyClass) // << true
    (afunctor instanceof MyClass) // << false
    (afunctor.asObject === aobj) // << true
    
    // to bind with a previous function...
    var afunctor = (new MyClass()).asFunctor(function() { alert('I am the original call'); });
    afunctor() // << first calls the original, then execute();
    // To simply wrap a previous function, don't define execute() in the prototype.
    

    You could even chain bind countless other objects/functions/etc until the cows came home. Just refactor the proxy call a bit.

    Hope that helps. Oh, and of course you could change the factory flow so that a constructor called without the new operator then instantiates a new object and returns the functor object. However you prefer (you could surely do it other ways too).

    Finally, to have any function become the execution operator for a functor in a bit more elegant of a manner, just make the proxy function a method of Function.prototype and pass it the object to wrap if you want to do something like (you would have to swap templateFunction with this and this with the argument of course)…

    var functor = (function() { /* something */ }).asFunctor(aobj);
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

don't know if this is possible.. I'm using sqlite3 schema: CREATE TABLE docs (id
Don't you hate it when you have class Foobar { public: Something& getSomething(int index)
Don't let below code scare you away . The question is really simple, only
Don't be scared of the extensive code. The problem is general. I just provided
Don't dismiss this as a newbie question! It's not, I'm not, I've tried everything,
Don't really know how to formulate the title, but it should be pretty obvious
Don't know how to google for such, but is there a way to query
I don't know when to add to a dataset a tableadapter or a query
I don't edit CSS very often, and almost every time I need to go
I don't understand where the extra bits are coming from in this article about

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.