hasrthur
hasrthur

Reputation: 1490

Custom prototype chain for a function

I am just curious whether I can include an object into function prototype chain. What I mean:

var test = function() { return 'a'; };

console.log(test.bind(this)); // return new bound function

// changing the prototype
// in console the prototype is really set as needed
// test => new object => function prototype => Object prototype
var F = function() {};
F.prototype = Function.prototype;
test.prototype = new F();

console.log(test.bind()); // this still works and returns new bound function

test.prototype.bind = function() {
    return 'test';
};

console.log(test.bind()); // this does not work as expected -> returns new bound function instead of 'test'. When I do delete Function.prototype.bind, then console.log(test.bind) returns undefined

Upvotes: 4

Views: 574

Answers (1)

Bergi
Bergi

Reputation: 665455

You have a function test. It is a instanceof Function, and inherits from Function.prototype so that you can call test.bind for example.

Then you set the "prototype" property of your function to an object inheriting from Function.prototype. That means that all instances of test will inherit from that object (and from Function.prototype):

var t = new test;
t instanceof test; // => true
t instanceof Function; // => true

Then you overwrite the test property on your custom prototype object. You do good to do so, because Function methods should only be called on functions (i.e. callable objects):

>>> Function.prototype.bind.call({})
Unhandled Error: Function.prototype.bind: this object not callable

In your tests with console.log you only apply the Function methods on your test function, not on instances of it. Good, because they'd fail. So, I can see no reason why any objects should inherit from Function - you can't construct functions that don't inherit directly from Function.

Upvotes: 2

Related Questions