js override 实现
方法1:原型链继承与重写
通过修改对象的原型链实现方法重写。子类可继承父类原型并覆盖特定方法。
function Parent() {}
Parent.prototype.greet = function() { return "Hello from Parent"; };
function Child() {}
Child.prototype = Object.create(Parent.prototype);
Child.prototype.greet = function() { return "Hello from Child"; };
const child = new Child();
console.log(child.greet()); // 输出: "Hello from Child"
方法2:ES6 Class的extends与super
使用ES6的class语法和extends关键字实现方法重写,通过super调用父类方法。

class Parent {
greet() { return "Hello from Parent"; }
}
class Child extends Parent {
greet() { return super.greet() + " overridden by Child"; }
}
const child = new Child();
console.log(child.greet()); // 输出: "Hello from Parent overridden by Child"
方法3:直接修改对象方法
对已有对象实例的方法进行直接替换,适用于单例或特定实例的场景。

const obj = {
greet: function() { return "Original method"; }
};
obj.greet = function() { return "Overridden method"; };
console.log(obj.greet()); // 输出: "Overridden method"
方法4:使用Object.defineProperty
通过属性描述符控制方法的可写性,实现更精细的重写逻辑。
const obj = {};
Object.defineProperty(obj, 'greet', {
writable: true,
value: function() { return "Initial method"; }
});
obj.greet = function() { return "Overridden via defineProperty"; };
console.log(obj.greet()); // 输出: "Overridden via defineProperty"
方法5:高阶函数包装
通过函数包装实现动态重写,保留对原始方法的引用。
function original() { return "Original"; }
function override(fn) {
const originalFn = fn;
return function() { return "Overridden: " + originalFn(); };
}
const newFn = override(original);
console.log(newFn()); // 输出: "Overridden: Original"
注意事项
- 原型链重写会影响所有实例,而直接修改对象仅影响当前实例。
- 使用
Object.defineProperty时需注意writable和configurable属性的设置。 - ES6的
super只能在子类方法中使用,不可在普通函数中调用。






