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 -> …