1

When function object is used as constructor then proper prototype chain is maintained as marked in point 1 and point 2.

But as shown in following code new instances prototypes are skipping Function.prototype and directly inheriting from Object.prototype. Is there specific reason for that?

Function.prototype.extraFun = function(){console.log('funny function')};

function Thing(name){
    this.name = name;
}

Thing.prototype.specs = function(){
    return `name: ${this.name}`;
}

var table = new Thing('wooden table');

table.__proto__ == Thing.prototype //true       [OK]            (1)
Thing.__proto__ == Function.prototype //true    [OK]            (2)  

//it should show follow the above rythm
Function.__proto__ == Object.prototype //false               (A)

//why 
Function.__proto__ == Object.__proto__ //true                (B)

//it should be false
table.__proto__.__proto__ == Object.prototype // true             (3)  

//it should be true because function object is instance of Function NOT Object directly
table.__proto__.__proto__ == Function.prototype //false            (4)

But issue is why point 3 is true and point 4 is false. Further more Point A and B are deviate from normal order unlike point 1 and 2

1
  • 2
    table is not a function (and cannot be called). Why would you expect it to inherit from Function.prototype? Commented Sep 9, 2021 at 20:12

2 Answers 2

2
table.__proto__ == Thing.prototype //true       [OK]            (1)
Thing.__proto__ == Function.prototype //true    [OK]            (2)  

//it should show follow the above rythm
Function.__proto__ == Object.prototype //false               (A)

//why 
Function.__proto__ == Object.__proto__ //true                (B)

Not really. table is the odd one out. The rythm goes like this:

Thing.__proto__ == Function.prototype //true    [OK]
Function.__proto__ == Function.prototype //true [OK]
Object.__proto__ == Function.prototype //true   [OK]

Can you see what these have in common? They're constructor functions.

table.__proto__ == Thing.prototype //true       [OK]            (1)
Thing.__proto__ == Function.prototype //true    [OK]            (2) 
table.__proto__.__proto__ == Object.prototype // should be false but is true?
table.__proto__.__proto__ == Function.prototype // should be true but is false?

No, there is no function object (that would be an instance of Function, and inherit from Function.prototype) involved in the prototype chain of table. You seem to be thinking that Thing.prototype and Thing.__proto__ are the same thing - but no, they're absolutely not.

The inheritance chain simply goes

           table.__proto__ == Thing.prototype
 Thing.prototype.__proto__ == Object.prototype
Object.prototype.__proto__ == null
Sign up to request clarification or add additional context in comments.

Comments

1

Constructors (Thing, Function, Object) are functions, so they have Function.prototype in their prototype chain.

Function.prototype and Thing.prototype inherit from Object.prototype:

enter image description here

The lines represent .__proto__ dependencies (upwards).

See How does JavaScript prototype work?, where I also posted an answer.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.