2

プロパティ (1) をオーバーライドし、隠しプロパティ (2) を定義するデコレータを実装しようとしています。次の例を想定します。

function f() {
    return (target: any, key: string) => {

        let pKey = '_' + key;

        // 1. Define hidden property
        Object.defineProperty(target, pKey, {
            value: 0,
            enumerable: false,
            configurable: true,
            writable: true
        });

        // 2. Override property get/set
        return Object.defineProperty(target, key, {
            enumerable: true,
            configurable: true,
            get: () => target[pKey],
            set: (val) => {
                target[pKey] = target[pKey] + 1;
            }
        });
    };
}

class A {
    @f()
    propA = null;
    propB = null;
}

let a = new A();

console.log(Object.keys(a), a.propA, a._propA, a);

どの出力:

[ 'propB' ] 1 1 A { propB: null }

ただし、次のことを期待したいと思います。

[ 'propA', 'propB' ] 1 1 A { propA: 1, propB: null }

ですのでenumerableご了承ください。truepropA

さて、 とを置き換えるgetset

get: function () {
    return this[pKey]
},
set: function (val) {
    this[pKey] = this[pKey] + 1;
}

出力は次のとおりです。

[ '_propA', 'propB' ] 1 1 A { _propA: 1, propB: null }

ただし、 for in にenumerable明示的に設定されています。false_propAf

したがって、これらの動作が奇妙である可能性があるので、ここで何が起こっているのか、取得しようとしているものをどのように実装するのかを理解したいと思いますか?

4

2 に答える 2