重新定义$ scope中属性的getter和setter

时间:2018-10-17 18:59:04

标签: javascript angularjs

我正在建立一个重新定义$scope中属性的设置器和获取器的提供程序。提供程序将计算该属性被修改的次数。

我将尽可能简化代码,以便更轻松地解决问题。

控制器

[...]

export default function(myTracker) {
    $scope.user = 'test';
    mytracker.track($scope, 'user');
}

提供商

[...]
export default function myTrackerProvider() {
    [...]
    this.$get = function() {

        var myTracker = {};

        myTracker.track = function (scope, reference) {

            Object.defineProperty (scope, reference, {

                _ref: scope[reference],

                get: function() {
                    return this._ref;
                }

            });

            console.log(scope[reference]);
        }
}

我确定必须使用另一个变量,例如_ref来避免循环调用,但是我不明白为什么它不能以这种方式工作。 为什么在_ref: scope[reference]之后,scope[ref]未定义?

更新:如果我尝试运行此命令,则末尾的控制台将打印未定义的内容。

1 个答案:

答案 0 :(得分:0)

我以这种方式解决了这个问题:

[...]
export default function myTrackerProvider() {
    [...]

    var counterGets = 0;
    var counteerSets = 0;

    this.$get = function() {

        var myTracker = {};

        myTracker.track = function (scope, reference) {

            scope._ref = scope[reference];

            Object.defineProperty (scope, reference, {

                get: function() {
                    counterGets++:
                    console.log("get calls: ", counterGets);
                    return this._ref;
                },

                set: function(value) {
                    counterSets++;
                    console.log("get calls: ", counterSets);
                    this._ref = value;
                }

            });


        }
}

我的问题是我坚持将临时变量放在Object.defineProperty函数中,而不可能是可能的。唯一接受的参数是@Heretic Monkey提供的MDN链接中列出的参数。 另外,console.log必须放在函数中(很明显)。