我们能在JavaScript中实现对象文本的封装吗?
我们知道当我们使用对象文字时,或者当我们使用对象时。Create()要继承父对象的新对象,子对象继承父对象的所有属性和函数 那么,我们如何从继承的类中隐藏私有成员呢我们能在JavaScript中实现对象文本的封装吗?,javascript,Javascript,我们知道当我们使用对象文字时,或者当我们使用对象时。Create()要继承父对象的新对象,子对象继承父对象的所有属性和函数 那么,我们如何从继承的类中隐藏私有成员呢 因此,如果我们不能,这意味着使用函数作为类和从父类继承的“new”关键字,是在JavaScript中实现封装的唯一方法 获得封装的最简单方法是函数或匿名函数(闭包)。这是一个信息隐藏和getter/setter逻辑的示例,而经典的JS(不是ES6/Harmony)显然不支持它: var obj = (function () {
因此,如果我们不能,这意味着使用函数作为类和从父类继承的“new”关键字,是在JavaScript中实现封装的唯一方法 获得封装的最简单方法是函数或匿名函数(闭包)。这是一个信息隐藏和getter/setter逻辑的示例,而经典的JS(不是ES6/Harmony)显然不支持它:
var obj = (function () {
var hidden;
hidden = 1973;
return {
"get": function () { return hidden; },
"set": function (v) { hidden = v; }
};
}()); // define and execute right away
您现在可以按如下方式使用obj
:
obj.get() // returns the hidden value
obj.set(1982) // sets the hidden value
信息隐藏演示:
obj.hidden // no dice
JS中的OO编程并不真正支持经典继承。
它支持有其差异的原型继承
简而言之,答案是否定的。对象文本中的所有属性都是公共的(至少截至) 这就是说,由于,封装确实存在于Javascript中,并且可以通过使用来实现 例如,
myObjectWithPrivateMembers
返回的对象可以访问封装属性value
,该属性不公开/不可访问(因为该对象是在闭包中定义的)
“如何隐藏私有成员”JavaScript中没有私有成员(我假设是属性)。你能举一个例子来说明你在说什么吗?封装可以通过JS中的闭包来完成。@Amir:当然,但这与对象文字有什么关系?按照当前发布的标准(ES 5.1),没有办法在对象上拥有私有属性。不过,为了支持这一想法,ECMAScript 6中引入了一些新技术。访问属性需要使用相同的符号。@阿米尔:您不能。这就是我评论的重点。没有私人财产。没有“私人成员”。您所指的是使用闭包来封装数据。我不会称之为“私人会员”。我已经说过我知道这一点。我想知道是否有可能实现对象文本的封装?啊,好的:)好吧。。。我认为这些评论已经很好地回答了ES5和ES6的问题……我知道原型继承和经典继承。我想说的是,在一些文章中,我们看到他们试图将面向类的概念引入面向对象(比如说面向原型)。我可以引用《你不知道JS》一书中的一段话:“我相信标签“原型继承”本身(并试图错误地应用所有相关的面向类的术语,如“类”、“构造函数”、“实例”、“多态性”等)在解释JavaScript机制的真正工作原理时弊大于利。”你说得对,它弊大于利。尤其是弗拉纳根的《圣经》在第五版之前一直具有明显的误导性。我们不得不等待Crockford的“好的部分”,看看OO模式在没有类的情况下到底有多好。有很多平庸的JS书籍。不要在上面浪费时间:)
function myObjectWithPrivateMembers() {
var value = 1;
var addOne = function() {
value++;
};
var getValue = function() {
return value;
};
return {
addOne: addOne,
getValue: getValue
};
}
var test = myObjectWithPrivateMembers();
test.value; // undefined
test.getValue(); // 1
test.addOne();
test.getValue(); // 2