Javascript 如何访问私有变量

Javascript 如何访问私有变量,javascript,ecmascript-6,ecmascript-5,Javascript,Ecmascript 6,Ecmascript 5,在下面的示例中,我使用Kyle Simpson的“OLOO(对象链接到其他对象)模式”创建一个简单的对象序列化示例 我需要将变量\u数据保持私有(我使用的是闭包),并仅使用在对象实例级别(在init中)创建的getter和setter公开其属性 目前,我在init中定义了函数toJson,这样它就可以访问\u数据,并且可以正常工作,但我想知道: 如果可以将toJson函数移到init之外(将它放在与fromJson相同的级别),那么它可以通过原型链访问,但允许访问\u数据变量(我怀疑这是不可能

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

我需要将变量
\u数据
保持私有(我使用的是闭包),并仅使用在对象实例级别(在
init
中)创建的getter和setter公开其属性

目前,我在
init
中定义了函数
toJson
,这样它就可以访问
\u数据
,并且可以正常工作,但我想知道:

  • 如果可以将
    toJson
    函数移到
    init
    之外(将它放在与
    fromJson
    相同的级别),那么它可以通过原型链访问,但允许访问
    \u数据
    变量(我怀疑这是不可能的,因为
    \u数据
    它在一个闭包中)
  • 否则,考虑到
    \u数据
    不应该是可枚举的,也不应该使用getter和setter分别进行修改,您是否可以建议一个更好的替代方案(即使使用ES6)
//对象的序列化和反序列化示例
(功能(窗口){
var dataApi='{“id”:0,“top”:10,“left”:20,“width”:100,“height”:150}';
var state=JSON.parse(dataApi);
var基={
init:函数(数据){
var _data=data;//私有
//在对象本身而不是在其原型上定义
Object.defineProperty(此“id”{
get:function(){
返回_data.id;
},
设置:函数(值){
_data.id=值;
}
});
Object.defineProperty(这是“top”{
get:function(){
返回_data.top;
},
设置:函数(值){
_data.top=值;
}
});
Object.defineProperty(这个“左”{
get:function(){
返回_data.left;
},
设置:函数(值){
_data.left=数值;
}
});
Object.defineProperty(此“宽度”{
get:function(){
返回_data.width;
},
设置:函数(值){
_data.width=值;
}
});
Object.defineProperty(此“高度”{
get:function(){
返回_data.height;
},
设置:函数(值){
_data.height=数值;
}
});
this.toJson=函数(){
//将此函数移到prototype
返回JSON.stringify(_数据);
}
},
//基于原型定义
fromJson:函数(json){
var data=JSON.parse(JSON),
obj=Object.create(这个);
对象初始化(数据);
返回obj;
}
};
//使用反序列化创建具有链接原型的对象
var wdgA=base.fromJson(dataApi);
//序列化对象
var str=wdgA.toJson();
console.log(str);
//使用数据注入创建对象
var wdgB=Object.create(base);
wdgB.init(状态);
var id=wdgB.id;
console.log(id);
})(窗口)
我需要将变量
\u数据
保持私有(我使用的是闭包)。是否可以将
toJson
函数移到
init
之外


不可以。无法从外部访问私有变量。

如果问题不清楚,请添加一条评论,我会尽力澄清。谢谢。将_数据设为不可枚举的私有对象属性。JS中没有安全性,也没有理由热衷于封装。@estus他/她会如何将其保密?@Taurus我不知道你的意思<代码>\uu
前缀在JS中是常规的,用于标记在正常情况下不应从外部访问的私有属性。它们可以是不可枚举的,不会意外出现在属性列表中。@estus在您的情况下,他/她是否将
\u foo
属性直接添加到对象中,如:
var obj={u foo:“bar”},然后使其
可枚举:false