我的简单例子:
let a = { foo : 5}, b = { stuff : 7};
let func = function(obj, prop) { ++obj[prop]; }
func(a, 'foo');
func(b, 'stuff');
当我调用func
时,我直接将属性名称设置为字符串文字。如果我想要延迟重命名属性(在我的代码源中),那么我也必须更改字符串文字。是否可以在运行时将属性名称作为字符串获取,而不是将字符串值用作文字?
UPD (为清晰起见)
在我的项目中,我有一些类,每个类都有一个包含数组的属性。但是这个属性对每个类都有不同的名称。我有处理这些数组内容的逻辑。每个类的逻辑都是相同的。现在我将属性名称作为字符串文字传递,但如果我稍后在我的代码源中重命名这些属性,那么我必须更改字符串文字。如果我忘记这样做,我会遇到问题。所以我想在这个任务中摆脱字符串文字的使用。
答案 0 :(得分:1)
我认为你要做的是一个坏主意。如果某些内容在不同对象中的行为相同,请将其命名为相同名称。但是,嘿,有一个ES6的概念!
JavaScript使用符号来支持不同“类”中的类似行为。所以我们在这里做。
让我们创建一个符号:
const incrementableProp = Symbol("incrementableProp")
首先,让我们在对象中存储应该具有行为的属性名称:
const a = {
specialProp: [],
[incrementableProp]: "specialProp"
}
符号本身将始终相同,因此递增函数可以可靠地找到它:
function incrementProp(obj) {
if(incrementableProp in obj)
obj[obj[incrementableProp]]++
else throw new TypeError("This object does not support an incremental property.")
}
最后,让我们确保您只需删除对象中的符号定义即可更改名称一次。我们将使用装饰器:
function special(target, key, descriptor) {
target[incrementableProp] = key
return descriptor
}
所以现在你可以这样做:
const a = {
@special specialProp: []
}