In this case, foo is a constructor function and B and C are objects. I am very confused, first off when you create an object does it always come with the properties and proto? Is that the default? Also in terms of the constructor function for foo. Am I correct to say that every proto of a function defaults to Function.prototype, which uses Object.prototype to create an object? The part that is confusing for me is Foo.prototype, when was this prototype created? Does a constructor function always default to the creation of a prototype which a constructor reference set back to itself and a proto set to object?
No wonder there is confusion. The picture is misleading to the point of being incorrect!
Objects created by calling a constructor function with the new
keyword have their inheritance chain set to start with the prototype
property of the constructor (correct in the picture).
The prototype
property is created every time a function is declared using the function
keyword to cover the case of the function being use as a constructor later - so you don't need to specify if a function is a constructor or not. For completeness, functions generated by the class
keyword also have a prototype
property.)
The function's prototype property's constructor
property is set to the function when the prototype property is created (meaning when the function is declared). Again the picture is correct: the value of Foo.prototype.constructor
is a reference to Foo
.
What is wrong in the picture is objects a
and b
somehow joining together in a reverse fork and their properties becoming available to instances of Foo
.
constructor
is always an inherited property. If you replace the original prototype
property of a function object with another object, you replace the constructor
property inherited by objects constructed with the function. Although you can reset the constructor
property of a functions prototype
property, it's reasonably unusual and not a part of the story the picture is presenting.
If you do modify the inheritance chain by changing a function's prototype
property value, the inheritance chain is still always a single threaded chain back to Object.prototype
and then null
. The inheritance chain never forks as shown in the picture. If you modified Foo.prototype
in the picture to make it a
or b
, the constructor
property of Foo
instances would not be Foo
.
The picture requires a lot of explanation to be useful.