You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:01:04