function F() { } function G() { } var p = {}; F.prototype = p; G.prototype = p; var f = new F(); var g = new G(); //alert(f instanceof F); // returns true, все ясно //alert(f instanceof G); // returns true, почему так?? они ведь даже никак не связаны //alert(g instanceof F); // returns true, почему так?? //alert(g instanceof G); // returns true, все ясно F.prototype = {}; alert(f instanceof F); // returns false, почему так?? g.__proto__ = {}; g instanceof G; // returns false, почему так?? 

    1 answer 1

    the whole point is how the instanceof operator works - it compares the prototype of an object with the prototype property of the constructor (and then the prototype prototype with the prototype property of the constructor, etc., until null)

     f instanceof F <==> f.__proto__ === F.prototype 

    so you have the F and G constructors in the prototype property containing a link to the same object, so all objects generated by these constructors using new will also have a prototype link to this object when you do:

     F.prototype = {}; 

    you change the reference to another object, and object f contains a reference to the old prototype. in case of

     g.__proto__ = {}; 

    the same, but vice versa.