OLOO如何访问私有变量
OLOO how to access private variable
在下面的示例中,我使用 Kyle Simpson 的 "OLOO (Objects Linking to Other Objects) Pattern" 创建对象序列化的简单示例。
我需要将变量 _data
保持私有(我正在使用闭包)并仅使用在对象实例级别创建的 getter 和 setter 公开其属性(在init
).
目前我在 init
中定义了函数 toJson
,因此它可以访问 _data
并且它有效,但是,我想知道:
- 如果可以将
toJson
函数移动到 init
之外(将其放在与 fromJson
相同的级别),那么它可以通过原型链访问但允许访问 _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
?
没有。无法从外部访问私有变量。
在下面的示例中,我使用 Kyle Simpson 的 "OLOO (Objects Linking to Other Objects) Pattern" 创建对象序列化的简单示例。
我需要将变量 _data
保持私有(我正在使用闭包)并仅使用在对象实例级别创建的 getter 和 setter 公开其属性(在init
).
目前我在 init
中定义了函数 toJson
,因此它可以访问 _data
并且它有效,但是,我想知道:
- 如果可以将
toJson
函数移动到init
之外(将其放在与fromJson
相同的级别),那么它可以通过原型链访问但允许访问_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 movetoJson
function outsideinit
?
没有。无法从外部访问私有变量。