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

JavaScript中如何在属性自身内部获取该属性的名称?

嘿,这个需求我之前也碰到过!要在对象属性的内部拿到它自己的属性名,直接在对象字面量里写肯定行不通——毕竟JS没有原生语法能让你在定义属性时直接引用它的名字。不过没关系,我给你整理了几个实用的方案:

方法一:用工厂函数手动绑定(简单直观)

写一个小函数,专门生成带name属性的对象,创建属性时把属性名传进去就行。这种方法简单易懂,不容易出bug:

// 工厂函数:接收属性名,返回包含name的对象
function createNamedProp(propName) {
  return {
    name: propName.toString()
  };
}

// 定义你的对象
let myObj = {
  myProperty: createNamedProp('myProperty'),
  anotherProp: createNamedProp('anotherProp') // 新增属性也一样操作
};

console.log(myObj.myProperty.name); // 输出 'myProperty'
console.log(myObj.anotherProp.name); // 输出 'anotherProp'

方法二:用Getter函数动态获取(无需额外工厂)

如果不想单独写工厂函数,可以用对象的getter特性,在访问属性时动态生成包含name的对象:

let myObj = {
  get myProperty() {
    // 这里直接写死属性名,返回带name的对象
    return {
      get name() {
        return 'myProperty';
      }
    };
  }
};

console.log(myObj.myProperty.name); // 输出 'myProperty'

不过要注意:每次访问myObj.myProperty都会生成一个新对象,如果需要复用同一个对象,可以在getter里加个缓存。

方法三:用Proxy实现全自动绑定(最灵活)

如果想要完全不用手动维护属性名和name的对应关系,新增属性时自动生效,可以用Proxy拦截属性访问,动态给对象加上name属性:

// 封装一个创建带自动name属性对象的函数
const createAutoNamedObj = (originalObj) => {
  return new Proxy(originalObj, {
    get(target, propKey) {
      const value = target[propKey];
      // 如果属性值是对象且没有name属性,就动态添加
      if (typeof value === 'object' && value !== null && !('name' in value)) {
        return { ...value, name: propKey.toString() };
      }
      return value;
    }
  });
};

// 使用这个函数创建对象
let myObj = createAutoNamedObj({
  myProperty: {},
  anotherProp: { desc: '这是另一个属性' } // 原有属性不会被覆盖
});

console.log(myObj.myProperty.name); // 输出 'myProperty'
console.log(myObj.anotherProp.name); // 输出 'anotherProp'
console.log(myObj.anotherProp.desc); // 输出 '这是另一个属性'

这个方案适合属性较多或者需要动态新增属性的场景,一劳永逸。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:36:11