如何为JavaScript内置String对象添加getter方法?
给String对象添加无括号调用的Getter方法解决方案
嘿,我懂你碰到的这个麻烦——想给String加个不用括号就能直接调用的getter,但试了defineProperty却报错说它不是函数,去掉prototype也没用,最后用废弃的__defineGetter__才凑活能用对吧?
其实问题出在你调用defineProperty的方式上!咱们得搞清楚:defineProperty是Object对象的静态方法,不是String构造函数本身的方法,而且要让所有字符串实例都用上这个getter,必须操作String.prototype才行。
给你看正确的写法,用标准的、未废弃的方式实现:
// 给String原型添加自定义getter Object.defineProperty(String.prototype, 'reverseStr', { get() { // 这里的this指向当前的字符串实例 return this.split('').reverse().join(''); }, // 可选配置:防止属性被修改/删除,默认enumerable是false(不会被for...in遍历) configurable: false, enumerable: false }); // 测试一下效果 const testStr = 'hello world'; console.log(testStr.reverseStr); // 输出 "dlrow olleh"
如果觉得上面的写法有点繁琐,ES6+还支持更简洁的语法直接在原型上定义getter:
// 简洁版写法 Object.defineProperty(String.prototype, 'lengthDouble', { get() { return this.length * 2; } }); console.log('abc'.lengthDouble); // 输出 6
之前你报错的原因大概率是直接写了String.defineProperty(...),这肯定不行,因为String构造函数本身没有这个方法,必须通过Object.defineProperty来操作它的原型。而__defineGetter__确实已经被标准废弃了,虽然现在很多环境还兼容,但未来可能会被移除,所以绝对不推荐用。
最后提醒一句:给原生对象原型加自定义属性的时候要小心,尽量用独特的命名,避免和未来ECMAScript标准新增的属性重名哦!
内容的提问来源于stack exchange,提问作者stackers
相关产品推荐
相关产品推荐

