如何将属性名称作为字符串?

时间:2017-10-30 06:59:35

标签: javascript typescript

我的简单例子:

let a = { foo : 5}, b = { stuff : 7};
let func = function(obj, prop) { ++obj[prop]; }
func(a, 'foo');
func(b, 'stuff');

当我调用func时,我直接将属性名称设置为字符串文字。如果我想要延迟重命名属性(在我的代码源中),那么我也必须更改字符串文字。是否可以在运行时将属性名称作为字符串获取,而不是将字符串值用作文字?

UPD (为清晰起见)

在我的项目中,我有一些类,每个类都有一个包含数组的属性。但是这个属性对每个类都有不同的名称。我有处理这些数组内容的逻辑。每个类的逻辑都是相同的。现在我将属性名称作为字符串文字传递,但如果我稍后在我的代码源中重命名这些属性,那么我必须更改字符串文字。如果我忘记这样做,我会遇到问题。所以我想在这个任务中摆脱字符串文字的使用。

1 个答案:

答案 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: []
}