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

JavaScript如何在对象内部引用自身的属性与方法

普通对象内部如何引用自身属性

首先给出参考的类实现写法:

class MyClass {
  constructor (a) {
    this.a = a;
  }

  foo() {
    // 业务逻辑
  }

  bar() {
    const baz = this.foo();
    // 基于baz处理业务逻辑
  }
}

上述类的bar()方法中,可以通过this直接调用同实例的foo()方法。如果不使用类语法,改用普通对象+工厂函数的模式实现相同逻辑,很容易写出失效的代码:

const myObj = (a) => {
  return {
    foo: () => {
      // 业务逻辑
    },
    bar: () => {
      const baz = foo(); // 作用域内找不到foo变量,运行报错
      const baz = myObj.foo() // myObj指向外层工厂函数,不是返回的实例对象,同样不生效
      // 基于baz处理业务逻辑
    }
  }
}

目前有一种可行但不够简洁的写法:先在工厂函数作用域内单独定义foo和bar函数,最后再将两个函数组装为对象返回,这种写法把方法定义和对象返回拆成了两步,结构不够聚合:

const myObj = (a) => {
  const foo = () => {
    // 业务逻辑
  };
  const bar = () => {
    const baz = foo();
    // 基于baz处理业务逻辑
  };

  return { foo, bar };
}

核心疑问:是否存在可以直接在对象字面量内部引用对象自身属性的写法?


可行方案

问题的根源是箭头函数没有独立的this绑定,会直接继承外层作用域的this值,因此用箭头函数定义的对象方法,内部无法获取到指向当前对象的this。只要将方法定义从箭头函数改为普通函数,就可以和类写法一致,通过this访问对象自身的属性:

const myObj = (a) => {
  return {
    foo: function () {
      // 业务逻辑
    },
    bar: function () {
      const baz = this.foo() // 可以正常调用foo方法
      // 基于baz处理业务逻辑
    }
  }
}

日常开发中更推荐使用ES6的对象方法简写语法,效果和上述普通函数定义完全一致,写法更简洁:

const myObj = (a) => {
  return {
    foo() {
      // 业务逻辑
    },
    bar() {
      const baz = this.foo() // 运行正常
      // 基于baz处理业务逻辑
    }
  }
}

内容的提问来源于stack exchange,提问作者bradlet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:27:18