JavaScript对象动态加属性直接赋值即可:obj.newKey = value或obj["newKey"] = value;点号要求合法标识符,方括号支持变量和特殊字符;Object.defineProperty默认添加不可枚举/不可写/不可配置属性;需防范原型链污染,推荐校验key或用Object.create(null)。

JavaScript 对象怎么动态加属性?直接赋值就行
不需要特殊函数或 API,obj.newKey = value 或 obj["newKey"] = value 都能立刻生效。这是 JavaScript 对象的底层特性——对象本质是可变的键值容器,所有属性访问语法最终都映射到内部的 [[Set]] 操作。
两种写法的区别:点号 vs 方括号
点号写法简洁但受限;方括号更灵活,适合运行时确定的属性名。
-
obj.name:要求name是合法标识符,且字面量已知(不能是变量) -
obj[key]:key可以是任意字符串或可转为字符串的值,支持变量、表达式、含空格/特殊字符的键名 - 如果用点号给不存在的属性赋值,不会报错,也不会触发 getter/setter(除非显式定义过)
- 方括号方式在遍历或拼接 key 时更安全,比如
obj[`user_${id}`] = data
注意 Object.defineProperty 的“陷阱”
虽然也能添加属性,但默认是不可枚举、不可配置、不可写的——这和直接赋值行为完全不同,容易导致后续遍历不到或改不了值。
const obj = {};
Object.defineProperty(obj, "hidden", {
value: 42,
// 没有设置 enumerable: true → for...in / Object.keys() 看不见它
// 没有设置 writable: true → obj.hidden = 99 不生效
// 没有设置 configurable: true → delete obj.hidden 返回 false
});
console.log(obj.hidden); // 42
console.log(Object.keys(obj)); // []
动态添加时还要小心原型链污染
如果目标对象继承自 Object.prototype(绝大多数情况都是),而你又用了用户输入当 key,就可能意外覆盖 toString、valueOf 这类基础方法。
立即学习“Java免费学习笔记(深入)”;
- 避免用不可信输入直接当 key:
obj[userInput] = ... - 加一层校验:
if (/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key)) { obj[key] = val; } - 更稳妥的做法是用
Object.create(null)创建无原型的对象,彻底规避污染风险
obj[key] = value 就够了;只有需要精确控制属性特性(比如只读、监听变化)时,才该考虑 Object.defineProperty 或 Proxy。











