简体   繁体   中英

Why does isPrototypeOf() return false?

I have the below constructors and SubType prototype pointing to an instance of SuperType. When I do x.isPrototypeOf(SubType.prototype) it returns false . I am confused as I have explicitly set x as a prototype for SubType . Can someone tell me why this is happening?

 function SuperType(){} function SubType(){} x = new SuperType(); SubType.prototype = x; SubType.prototype.constructor = SubType; console.log(x.isPrototypeOf(SubType)) // returns false console.log(SuperType.prototype.isPrototypeOf(SubType.prototype)) // returns true 

SubType is a function. What you probably want to check is if an instance of SubType would inherit from x :

 function SuperType(){} function SubType(){} x = new SuperType(); SubType.prototype = x; SubType.prototype.constructor = SubType; const instance = new SubType(); console.log(x.isPrototypeOf(instance)) // returns true console.log(SuperType.prototype.isPrototypeOf(SubType.prototype)) // returns true 

It helps to add properties to the objects to see what's happening. I fixed a little of your code. You can run this in the console:

function SuperType(foo){ this.foo = foo };
function SubType(bar){ this.bar = bar };

var x = new SubType("bar");

SuperType.prototype = x;
SuperType.prototype.constructor = SubType;

Now, you asked x.isPrototypeOf(SuperType) and it returns false, because x is not a property of the class SuperType . But when you instantiate a SuperType , x is a property of that new object:

var y = new SuperType("foo");
console.log(x.isPrototypeOf(y)) // returns true

In your example that is true, SubType.prototype is a prototype of SuperType.prototype and returns true.

console.log(SubType.prototype.isPrototypeOf(SuperType.prototype)) // returns true

I think that this is misunderstanding of prototype and __proto__ properties.

Lets modify example above a little

function SuperType(){}

function SubType(){}

x = new SuperType();

SubType.prototype = x;
console.log(x.isPrototypeOf(SubType)) // returns false.

// Now most interesting piece
SubType.__proto__ = x;
console.log(x.isPrototypeOf(SubType)) // Now true.

Demo

In place of SubType.__proto__ = x we may use Object.setPrototypeOf(SubType, x) which will yeilds the same result

The trik is __proto__ holds real object which is prototype. prototype is used only in constructor fucntions for defining prototype for constructed objects. (See here )

So if we again modify first example

function SuperType(){}

function SubType(){}

x = new SuperType();

SubType.prototype = x;

console.log(x.isPrototypeOf(SubType)) // returns false

var x2 = new SubType();
console.log(x.isPrototypeOf(x2)) // returns true

Demo

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM