js实现扩展方法
在JavaScript中实现类似C#的扩展方法可以通过原型链(prototype)或高阶函数实现。以下是几种常见方法:
通过原型链扩展
直接修改内置对象的原型,为其添加新方法(需谨慎,可能影响全局):
String.prototype.capitalize = function() {
return this.charAt(0).toUpperCase() + this.slice(1);
};
console.log("hello".capitalize()); // 输出 "Hello"
使用高阶函数包装
通过函数包装实现非侵入式扩展:
function extend(obj, extensions) {
Object.keys(extensions).forEach(key => {
obj[key] = extensions[key];
});
}
const stringExtensions = {
reverse() {
return this.split('').reverse().join('');
}
};
let str = "abc";
extend(str, stringExtensions);
console.log(str.reverse()); // 输出 "cba"
使用Proxy实现动态扩展
通过Proxy对象拦截属性访问实现动态方法扩展:
function createExtendable(target, extensions) {
return new Proxy(target, {
get(target, prop) {
return prop in extensions
? extensions[prop].bind(target)
: target[prop];
}
});
}
const extendedString = createExtendable("test", {
duplicate() {
return this + this;
}
});
console.log(extendedString.duplicate()); // 输出 "testtest"
注意事项
- 修改原生原型可能引发兼容性问题,建议在独立模块中使用
- 现代JavaScript推荐使用组合模式(Composition)替代扩展方法
- TypeScript中可通过声明合并实现类型安全的扩展方法
declare global {
interface String {
capitalize(): string;
}
}
String.prototype.capitalize = function() {
return this.charAt(0).toUpperCase() + this.slice(1);
};
以上方法可根据具体场景选择使用,原型链扩展最接近传统扩展方法的概念,而高阶函数和Proxy提供更安全的实现方式。







