不能重写function.prototype,因其是所有函数的共同原型,修改会污染全局;应正确设置子构造函数的prototype属性,如child.prototype = object.create(parent.prototype)。

在原型继承中,重写 Function.prototype 是强烈不推荐的,而且通常不是“处理”的对象——它不属于你实现继承时该操作的目标。真正需要关注和正确处理的,是构造函数的 prototype 属性(比如 Parent.prototype),而不是内置的 Function.prototype。
下面分几个关键点讲清楚:
为什么不能也不该重写 Function.prototype
-
Function.prototype是所有函数的共同原型(包括function Foo(){}、箭头函数、甚至class声明生成的构造函数)。 - 它本身是一个函数对象(
typeof Function.prototype === 'function'),其[[Call]]和[[Construct]]内部方法支撑整个 JS 的函数调用与new行为。 - 直接修改它(如
Function.prototype.myMethod = ...)会污染全局环境,影响所有函数,极易引发不可预知的冲突或破坏原生行为(例如干扰bind、call、toString等)。 - 大多数现代框架和 Linter(如 ESLint)会明确禁止此类操作。
正确要处理的是:子构造函数的 prototype
你在实现原型继承时,真正要“重写”或“设置”的,是子类构造函数自身的 prototype,让它指向一个以父类实例为原型的新对象。例如:
function Parent() {
this.name = 'parent';
}
Parent.prototype.say = function() { console.log('hello'); };
function Child() {}
// ✅ 正确:重写 Child.prototype,使其继承 Parent
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child; // 修复 constructor 指向
const c = new Child();
c.say(); // 'hello'
这里 Child.prototype 被重新赋值,但 Function.prototype 完全没动。
如果你看到类似 F.prototype = Parent.prototype 的写法(如寄生组合继承)
那只是临时借用一个空函数 F 来避免直接 new Parent() 带来的副作用(如执行父构造函数、共享引用属性),本质仍是设置 Child.prototype:
function inherit(Child, Parent) {
const F = function() {};
F.prototype = Parent.prototype; // ✅ 只读取,不修改
Child.prototype = new F(); // ✅ 修改的是 Child.prototype
Child.prototype.constructor = Child;
}
注意:F.prototype = Parent.prototype 是赋值引用,不是重写 Function.prototype;F 是普通函数,它的 prototype 属于它自己,和 Function.prototype 无关。
替代方案:用 Object.create 更安全
相比 new Parent(),推荐用:
Child.prototype = Object.create(Parent.prototype);
它直接以 Parent.prototype 为原型创建新对象,不调用 Parent 构造函数,规避了参数传递和引用属性共享问题,也完全绕开了对任何 prototype 的“重写”风险。
不复杂但容易忽略。











