js实现重写
重写方法的基本概念
在JavaScript中,重写通常指覆盖或修改已有的方法、属性或函数的行为。这可以通过原型继承、类继承或直接替换方法实现。
通过原型链重写方法
JavaScript基于原型继承,可以通过修改原型对象上的方法来重写功能。例如重写数组的toString方法:
Array.prototype.toString = function() {
return '[' + this.join(', ') + ']';
};
const arr = [1, 2, 3];
console.log(arr.toString()); // 输出: "[1, 2, 3]"
使用类继承重写
ES6类语法中,可以通过extends继承父类后重写方法:
class Parent {
greet() {
return 'Hello from Parent';
}
}
class Child extends Parent {
greet() {
return 'Hello from Child';
}
}
const child = new Child();
console.log(child.greet()); // 输出: "Hello from Child"
直接替换对象方法
对于具体实例,可以直接替换其方法:
const obj = {
sayHi: function() {
return 'Hi';
}
};
obj.sayHi = function() {
return 'Hello';
};
console.log(obj.sayHi()); // 输出: "Hello"
使用高阶函数包装
通过高阶函数可以在不修改原函数的情况下扩展功能:
function original() {
console.log('Original function');
}
function wrap(originalFn) {
return function() {
console.log('Before call');
originalFn();
console.log('After call');
};
}
const wrapped = wrap(original);
wrapped();
使用Proxy进行拦截
ES6的Proxy可以拦截并重写对象的默认行为:

const target = {
message: 'hello'
};
const handler = {
get: function(target, prop) {
return prop in target ? target[prop] : 'Not found';
}
};
const proxy = new Proxy(target, handler);
console.log(proxy.message); // 输出: "hello"
console.log(proxy.unknown); // 输出: "Not found"
注意事项
重写内置方法可能影响代码的可维护性和预期行为,应谨慎使用。确保新的实现兼容原有功能,避免破坏其他依赖该方法的代码。






