假设我们有以下代码:
"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
如果JavaScript中的所有函数都是对象,为什么Object.setPrototypeOf
不能处理函数?
setPrototypeOf
方法在函数上运行良好,现在可以执行EighthGrader.sayName()
(也就是说EightGrader
函数的.name
(,并且不能再执行以前从Function.prototype
继承的EighthGrader.call()
。
只是您不希望在函数上使用它,而是希望在carl
继承的原型对象上使用它。要做到这一点,你必须使用
Object.setPrototypeOf(EighthGrader.prototype, Student.prototype);
carl
的原型链是
carl -> EighthGrader.prototype -> …
不是
carl -> EightGrader -> …