Skip to content
Advertisement

Why doesn’t Object.setProtoypeOf work on functions?

Let’s say we have the below code:

"use strict";

function Student() {}

Student.prototype.sayName = function () {
  console.log(this.name);
};

function EighthGrader(name) {
  this.name = name;
  this.grade = 8;
}

Object.setPrototypeOf(EighthGrader, Student.prototype);
const carl = new EighthGrader("carl");

carl.sayName(); // Uncaught TypeError: carl.sayName is not a function

why doesn’t Object.setPrototypeOf work on function if all all function in JavaScript are also objects?

Advertisement

Answer

The setPrototypeOf method works just fine on functions, you can now do EighthGrader.sayName() (which will say the EightGrader function’s .name) and can no longer do EighthGrader.call() which was previously inherited from Function.prototype.

It’s just that you didn’t want to use it on the function, but rather on the prototype object that carl inherits from. To do that, you’ll have to use

Object.setPrototypeOf(EighthGrader.prototype, Student.prototype);

The prototype chain of carl is

carl -> EighthGrader.prototype -> …

not

carl -> EightGrader -> …
User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement