我们可以在JavaScript中实现对象文字的封装吗?

时间:2015-06-05 17:38:06

标签: javascript

我们知道何时使用对象文字或当我们使用 Object.Create()来继承父对象的新对象时,子对象会继承所有父对象的属性和功能。

那么,我们如何隐藏私有成员构成继承类?

因此,如果我们不能,则意味着将功能用作和" "要从父类继承的关键字,是在JavaScript中到达 ENCAPSULATION 的唯一方法!

2 个答案:

答案 0 :(得分:1)

获取封装的最简单方法是函数或匿名函数(闭包)。这是信息隐藏和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编程并不真正支持经典继承。   它支持原型继承,它有其不同之处。

答案 1 :(得分:1)

简短回答是否定。对象文字中的所有属性都是公开的(至少从ES5开始)。

也就是说,感谢lexical scoping,Javascript中存在封装确实,并且可以通过closures来实现。

例如,myObjectWithPrivateMembers返回的对象可以访问封装的属性value,该属性不公开/可访问(因为该对象在闭包中定义)。

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