3

是否有等价于didSetfrom Swiftin Javascript?Basicall 在变量更改时自动调用函数。这样做的目的是不必每次都调用一个函数,如下所示:

var x = someType()
x.behavior = newBehavior
alterBehavior(x, newBehavior)
function alterBehavior(var,behavior) { // change behavior of var }

我可以做

var x = someType()
someType didSet { // change behavior of var }
x.behavior = newBehavior

这是一个微不足道的示例,但对于我的用例而言,每次更改每个子属性时,这将为我节省大量时间/函数调用。

4

1 回答 1

2

Javascript 没有确切的等价物。

您可以使用代理来模拟等效的东西,这是较低级别的 API

const target = { 
    hello: "world", 
    didSet: (oldVal, newVal) => {
        console.log('oldVal =>', oldVal, 'newVal =>', newVal)
    }
}

const pseudoTarget = new Proxy(target, {
    set(object, prop, val) {
        const oldVal = object[prop]
        object[prop] = val
        if (typeof object.didSet === "function") {
            object.didSet(oldVal, val)
        }
    }
})

现在,当您设置属性时,didSet 函数将在存在时被调用。

pseudoTarget.hello = "new world"
VM544:4 oldVal => world newVal => new world
"new world"

对于现实世界的项目,您可能希望使用更高级别的库,例如:MobX

于 2018-07-08T08:40:25.043 回答