javascript - OLOO如何访问私有(private)变量

标签 javascript ecmascript-6 ecmascript-5

在下面的示例中,我使用 Kyle Simpson 的“OLOO(对象链接到其他对象)模式”来创建对象序列化的简单示例。

我需要保持变量 _data 私有(private)(我正在使用闭包)并仅使用在对象实例级别(在 init 中)创建的 getter 和 setter 公开其属性).

目前,我在 init 中定义了函数 toJson,因此它可以访问 _data 并且它可以工作,但是,我想知道:

  • 如果可以将 toJson 函数移动到 init 之外(将它放在 fromJson 的同一级别),以便可以通过原型(prototype)链访问它但允许访问 _data 变量(我怀疑这是不可能的,因为 _data 它在闭包中)。
  • 否则,您能否建议一个更好的替代方案(甚至使用 ES6),同时考虑到 _data 不应该是可枚举的,并且除了使用 getter 和 setter 之外不可修改?

        // example of serialization and deserialization of an object
        (function (window) {
            var dataApi = '{"id":0,"top":10,"left":20,"width":100,"height":150}';
            var state = JSON.parse(dataApi);
            var base = {
                init: function (data) {
                    var _data = data; // private
                    // defined on object itself not on its protoype
                    Object.defineProperty(this, 'id', {
                        get: function () {
                            return _data.id;
                        },
                        set: function (value) {
                            _data.id = value;
                        }
                    });
                    Object.defineProperty(this, 'top', {
                        get: function () {
                            return _data.top;
                        },
                        set: function (value) {
                            _data.top = value;
                        }
                    });
                    Object.defineProperty(this, 'left', {
                        get: function () {
                            return _data.left;
                        },
                        set: function (value) {
                            _data.left = value;
                        }
                    });
                    Object.defineProperty(this, 'width', {
                        get: function () {
                            return _data.width;
                        },
                        set: function (value) {
                            _data.width = value;
                        }
                    });
                    Object.defineProperty(this, 'height', {
                        get: function () {
                            return _data.height;
                        },
                        set: function (value) {
                            _data.height = value;
                        }
                    });
                    this.toJson = function () {
                        // move this function to prototype
                        return JSON.stringify(_data);
                    }
                },
                // defined on protoype
                fromJson: function (json) {
                    var data = JSON.parse(json),
                        obj = Object.create(this);
                    obj.init(data);
                    return obj;
                }
            };

            // create object with linked prototype using deserialization
            var wdgA = base.fromJson(dataApi);
            // serialize object
            var str = wdgA.toJson();
            console.log(str);

            // create object with data injection
            var wdgB = Object.create(base);
            wdgB.init(state);
            var id = wdgB.id;
            console.log(id);
        })(window);

最佳答案

I need to keep variable _data private (I am using a closure). Would it be possible to move toJson function outside init?

没有。无法从外部访问私有(private)变量。

关于javascript - OLOO如何访问私有(private)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40395762/

相关文章:

javascript - 如何将提取放入 Promise 中?

javascript - 数组中的 "..."(三点)表示法是什么意思?

javascript - javascript对象的属性名设置保留字需要加引号吗?

javascript - 是否有规范化 ECMAScript 5 的 JavaScript 项目

javascript - 获取句子中的单词

javascript - sails create-callback 没有插入值

javascript - 我的 JS 字谜图解决方案的时间、空间复杂度

javascript - 为什么 fn.call() 分配给变量后失败

javascript - 同步 Breeze ExecuteQuery

javascript - 如何将一个数组拆分为两个具有交替元素的数组