If I have a class called Person.
var Person = function(fname, lname){
this.fname = fname;
this.lname = lname;
}
Person.prototype.mname = "Test";
var p = new Person('Alice','Bob');
Now, p.__proto__ refers to prototype of Person but, when I try to do Person.__proto__, it points to function(), and Person.constructor points to Function().
Can someone explain what is the difference between function() and Function() and why the prototype of a Function() class is a function()?
2 Answers 2
Can someone explain what is the difference between function() and Function() and why the prototype of a Function() class is a function()?
__proto__ is an implementation-detail exposing the [[prototype]]. The [[prototype]] and the constructor need not be (are often not) the same thing. Anyway...
Consider this hypothesis: It is an impl. detail that depends on the engine -- and in the particular engine tested (FF, which version?), Function is an object which itself has a [[prototype]] of function. function is the primitive function-object. Person.prototype is (by default) of type function (the primitive function-object) and the assertions stated as a result of this apparent dichotomy. (JS has some quirks: new Number(0) is not the same as 0.)
However, this is not the case in IE(8). In IE the default prototype is a "plain object", not a function-object.
Comments
When defining a function like this:
var Person = function (fname, lname){
this.fname = fname;
this.lname = lname;
}
This will make Person a function. A function is an object, which needs to be constructed like any other 'first class' object, so it has a constructor: the constructor of all function objects, called Function.
The prototype of all functions appears to be an object called function.
I like to refer to a nice explanation by Mike Koss that learned me a lot.
2 Comments
__proto__ field is not standard ecmascript, yet the object.constructor property seems to be standardized (cfr w3schools.com/jsref/jsref_constructor_boolean.asp)