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
相关产品推荐
相关产品推荐

