26
console.log(typeof String.prototype); // object
console.log(typeof Number.prototype); // object
console.log(typeof Object.prototype); // object
console.log(typeof Boolean.prototype); // object

console.log(typeof Function.prototype); // function

Why does typeof Function.prototype return "function", not "object" like other prototype objects?

Thank you!

4
  • 5
    You could have asked the question without all the HTML. A good question though... Commented Feb 1, 2011 at 5:41
  • 1
    @AtesGoral Fixed now! Commented Oct 26, 2017 at 19:58
  • 1
    @Taurus Better late (6 years) than sorry! Commented Oct 27, 2017 at 23:14
  • 1
    @AtesGoral indeed. Commented Oct 27, 2017 at 23:55

4 Answers 4

17

This seems to be defined in ECMAScript 5:

15.3.4 Properties of the Function Prototype Object

The Function prototype object is itself a Function object (its [[Class]] is "Function") that, when invoked, accepts any arguments and returns undefined.

Sign up to request clarification or add additional context in comments.

4 Comments

ok but why? what's the reason behind it? Couldn't just be an object?
@BarbuBarbu: look in at here: ecma-international.org/ecma-262/6.0/…
@anand so the reason, based on my conclusion is this: "The Function prototype object is specified to be a function object to ensure compatibility with ECMAScript code that was created prior to the ECMAScript 2015 specification." ?
@BarbuBarbu Why is that then ? Why did ECMAScript code that was created prior to the ECMAScript 2015 specification have Function.prototype as an empty function ?
6

Its mentioned in the ECMAScript2015

http://www.ecma-international.org/ecma-262/6.0/#sec-properties-of-the-function-prototype-object :

Th Function prototype object is specified to be a function object to ensure compatibility with ECMAScript code that was created prior to the ECMAScript 2015 specification.

This function object does not actually do anything that a function object is meant to do. You can call it with any arguments & it returns undefined. It is a dumb wrt. function object. It's a normal prototype object.

And since it's just there for compatibility reasons, it does not even has a prototype property.

For more elaboration, you can refer this answer: enter link description here

Comments

1

Because function is a native object which among other properties has internal [[Construct]] and [[Call]] properties and also explicit prototype property — the reference to a prototype of the future objects. And its class is function.

F.[[Class]] = "Function"
F.[[Call]] = <reference to function> // function itself

Thus [[Call]] besides the [[Class]] property (which equals to "Function") is the main in respect of objects distinguishing. Therefore the objects having internal [[Call]] property are called as functions. The typeof operator for such objects returns "function" value.

see for reference

Comments

-1

Since it has all the methods and props that any function is ought to have, this makes it effectively a function ...

Think about it for a moment and let it sink and you'll get the picture by then :)

2 Comments

Function.prototype does not have all the methods and props that any function is ought to have quoting @traktor53 from stackoverflow.com/a/32929169/7206799 "Another reason to think Function.prototype is not a Function object in the usual sense (apart from saying so in the documentation) is that it cannot be called as a constructor and throws an error if an attempt is made to do so. Since the prototype property of a function is used when the function is called as a constructor, it makes sense for Function.prototype not to have this property"
though you do have a point because the logic you mention was used in ES5 time, see the very nice explanation here: stackoverflow.com/a/32929083/7206799

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.