如何在JavaScript中定义类似.toUpperCase的无参字符串点函数?
如何在JavaScript中定义类似
.toUpperCase()的无参链式方法 要实现像.toUpperCase()这种无需传参、可直接在字符串/对象实例上调用的方法,核心是给对应数据类型的原型对象添加自定义函数——因为JS中所有同类型的实例都会共享原型上的方法。
一、给字符串添加自定义无参方法
你给出的示例已经是标准实现方式,拆解下逻辑:
let ex = "hi .this is &$234234 a test @#"; let tmp = ex.textformating(); // 给String原型添加方法 String.prototype.textformating = function (){ // this指向调用方法的字符串实例(即ex) return this.replace(/[^a-z0-9 ]/gi, ' ').trim(); }
String.prototype是所有字符串实例的原型,给它加方法后,任何字符串都能直接调用.textformating()- 方法内的
this就是当前调用方法的字符串本身,直接用它执行处理逻辑即可 - 执行后返回处理后的新字符串(不会修改原字符串,因为字符串是原始值,不可变)
再举一个实用的进阶例子:给字符串加一个转驼峰命名的无参方法
String.prototype.toCamelCase = function() { return this.toLowerCase() .replace(/[^a-z0-9]+(.)/g, (_, char) => char.toUpperCase()) .replace(/^[^a-z]+/, ''); }; // 使用示例 let rawStr = "HELLO_WORLD foo-bar!!!"; console.log(rawStr.toCamelCase()); // 输出:helloWorldFooBar
二、给自定义对象添加无参方法
如果是自己定义的对象类型,同样通过扩展其构造函数的原型来实现:
传统构造函数方式
// 自定义用户构造函数 function User(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; } // 扩展原型,添加无参方法 User.prototype.getFullName = function() { return `${this.firstName} ${this.lastName}`; }; // 使用 let user = new User("John", "Doe"); console.log(user.getFullName()); // 输出:John Doe
ES6 Class方式(更简洁)
class User { constructor(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; } // 直接在类中定义原型方法 getFullName() { return `${this.firstName} ${this.lastName}`; } } let user = new User("Jane", "Smith"); console.log(user.getFullName()); // 输出:Jane Smith
三、注意事项
- 避免污染内置对象原型:随意给
String、Array这类内置对象加方法,可能和其他库或未来JS新增的方法重名,引发冲突。如果一定要用,可以用Symbol作为方法名避免冲突:
const textFormatting = Symbol('textFormatting'); String.prototype[textFormatting] = function() { return this.replace(/[^a-z0-9 ]/gi, ' ').trim(); }; // 调用方式 let ex = "hi .this is &$234234 a test @#"; let tmp = ex[textFormatting]();
- 原始值的自动包装:调用字符串、数字这类原始值的原型方法时,JS会自动把它们包装成对应的对象(比如
String对象),方法执行完后又会自动拆回原始值,无需手动处理。
内容的提问来源于stack exchange,提问作者mehdi mostofi
相关产品推荐
相关产品推荐

