在JavaScript中使用get和set作为对象属性名是否安全?
在对象字面量中使用
get/set作为属性名是否安全? 好问题!先给你一个明确的结论:完全安全,不用担心和内置行为冲突,下面给你拆解原因:
本质是两个完全不同的概念
你提到的两种场景里,get和set扮演的角色完全不一样:- 在普通对象字面量(比如
{ get: 'value1', set: 'value2' })中,get和set只是普通的字符串属性名——和你写name: '张三'里的name没有任何区别,JavaScript会把它们当作普通键处理,访问myObject.get只会返回你赋值的'value1'。 - 而在
Object.defineProperties(或者Object.defineProperty)的配置对象里,get和set是专门用于定义存取器属性的特殊配置项,属于该方法的语法约定,和对象自身的属性名完全不搭边。
- 在普通对象字面量(比如
举个直观的对比例子
比如你同时写这两段代码:// 普通属性名 const obj = { get: 'hello', set: 'world' }; console.log(obj.get); // 输出: 'hello' // 定义存取器属性 Object.defineProperties(obj, { foo: { get() { return this.get + ' ' + this.set; }, set(newVal) { [this.get, this.set] = newVal.split(' '); } } }); console.log(obj.foo); // 输出: 'hello world'你看,这里的
obj.get还是普通属性,和存取器配置里的get没有任何冲突——它们一个是对象的键,一个是配置对象的特殊关键字,完全井水不犯河水。额外补充:存取器语法的区分
可能你会想到ES5+里对象字面量的存取器语法,比如{ get foo() {} }——这时候get是语法关键字,但它是和后面的属性名(比如foo)绑定的,和直接把get作为属性名的写法完全不同:const obj = { get: '普通属性', get bar() { return '存取器属性'; } }; console.log(obj.get); // '普通属性' console.log(obj.bar); // '存取器属性'两种写法共存也不会有任何问题。
总的来说,get和set并不是JavaScript的保留字,只是在特定语法场景下(比如存取器定义)有特殊作用,但作为普通对象的属性名使用时,完全不会触发任何内置行为,放心用就好。
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

