Prototypal inheritance can be a bit of a brain bender. I've already written a simple explanation for prototypal inheritance in the following answer and I suggest you read it: https://stackoverflow.com/a/8096017/783743
Now to answer your question. Consider the following function:
function F() {}
I can create an instance of F
using new
as follows:
var f = new F;
As expected f instanceof F
returns true
. This is because the instanceof
operator checks for F.prototype
in the prototype chain of f
and returns true
if it is there. See the answer I linked to above.
Now say I create a new function G
as follows and set F.prototype
to G.prototype
:
function G() {}
F.prototype = G.prototype;
If I now evaluate f instanceof F
again false
is returned. This is because F.prototype
is no longer in the prototype chain of f
(remember that F.prototype
is now G.prototype
).
Now let's create a new instance of F
:
var g = new F;
If you evaluate g instanceof G
it'll return true
even though g = new F
. This is because G.prototype
exists in the prototype chain of g
.
This is not a bug. It's the way JavaScript works. In fact we can exploit this feature to create some really interesting functions: Instantiate JavaScript functions with custom prototypes