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

Fabric.js对象成员赋值问题:set方法无法正常设置_data自定义属性

解决自定义属性存储中set方法的动态键问题

这个问题我之前也碰到过,核心原因是你用点语法访问_data的属性时,key会被当作字面量字符串处理,而不是你实际想要传入的变量名——比如如果你的set方法是这么写的:

set(key, value) {
  this._data.key = value; // 这里的"key"是固定字符串,不是变量!
}

那不管你传入什么key值,最终都会给_data添加一个名为key的属性,这显然不是你要的效果。

最直接的解决方案:方括号语法

要实现动态设置属性,你需要用方括号语法来访问对象属性,它允许你用变量作为属性名。修改后的set方法应该是这样:

class YourRecord {
  constructor() {
    this._data = {}; // 集中存储自定义属性
  }

  set(key, value) {
    // 用方括号包裹变量key,就能动态匹配对应的属性名
    this._data[key] = value;
  }

  // 配套的get方法也可以用同样的思路实现
  get(key) {
    return this._data[key];
  }
}

// 测试一下
const rec = new YourRecord();
rec.set('nickname', 'testUser');
console.log(rec.get('nickname')); // 输出 "testUser"
console.log(rec._data); // 输出 { nickname: "testUser" }

关于你当前的临时方案

你现在用rec._data.key = 'newvalue'的方式虽然能生效,但直接操作内部的_data对象违背了封装原则——如果后续你要修改_data的存储逻辑(比如换成Map、或者添加属性校验),所有直接访问_data的代码都要同步修改。用封装好的set方法能把内部逻辑和外部调用隔离开,更利于长期维护。

进阶:处理嵌套属性(如果需要的话)

如果你的_data是多层嵌套的结构(比如_data.user.profile.age),可以写一个递归的set方法来支持路径式设置:

set(path, value) {
  const keys = path.split('.');
  let current = this._data;
  // 遍历到倒数第二个键,创建嵌套对象
  for (let i = 0; i < keys.length - 1; i++) {
    const key = keys[i];
    if (!current[key]) current[key] = {};
    current = current[key];
  }
  // 设置最终的属性值
  current[keys[keys.length - 1]] = value;
}

// 使用示例
rec.set('user.profile.age', 28);
console.log(rec._data.user.profile.age); // 输出 28

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:54:54