OOP getter函数应该返回私有属性的值或引用

时间:2012-03-05 10:09:18

标签: javascript

私有属性的getter应该返回对属性的引用或属性的值(如果属性是对象,则返回克隆)。

3 个答案:

答案 0 :(得分:3)

如果属性具有基本类型(字符串,数字,布尔值)或对不可变对象(StringNumber)的引用,则答案是直接返回值/引用,因为调用者无法用它来改变你的对象的状态。

如果属性具有可变对象(数组,ObjectDate,还有很多其他东西)的引用类型,则取决于您是否希望调用者是能够更改您的对象的副本的属性。如果这样做,请返回参考。如果没有,请克隆它。

例如,让我们假设一个具有私有数组的对象以及您可以对该数组执行的一些操作:

var obj = (function() {
    var o = {};
    var theArray = [];

    o.addItem = function(item) {
        theArray.push(item);
    };

    o.getItemAt = function(index) {
        return theArray[index];
    };

    return o;
})();

(请注意,这并不是对象设计的光辉榜样。:-))

现在您要添加getArray操作。你可以用两种方式做到这一点:

您可以返回对数组的引用:

o.getArray = function() {
    return theArray;
};

...这意味着调用者可以对其执行各种操作(例如从中删除项目,该对象以前不支持的操作),这将改变对象的状态(因为你已经让他们直接访问以前的私有阵列了。

或者你可以返回数组的克隆:

o.getArray = function() {
    return theArray.slice(0);
};

...这意味着调用者无法对私有数组执行任何操作,他们只能对您提供的副本进行操作。

答案 1 :(得分:0)

这取决于私有属性是否是不可变的。如果它是不可变的,则无法更改,并且返回它没有任何害处。但是如果它是可变的,那么返回它将打破信息隐藏的OOP原则。

如果它是一个原始的不可变int / number,那么返回私有属性很好,因为它实现了两件事:

  • 隐藏私有属性并提供接口,对私有属性实现的任何更改都不会轻易破坏接口
  • 调用者无法更改返回的对象(在本例中为值),因为它是基本类型并按值传递

但是,如果从方法返回一个可变数组,并且您的语言通过引用传递对象,那么您必须接受调用者可能决定更改此内部对象的事实 - 这很容易导致内部代码中断。

由于这些原因,如果您打算将副本返回到可变对象,请返回副本而不是基础对象本身。

答案 2 :(得分:0)

通常,无论在何处使用该属性,都不能更改属性值。这满足了OOP即封装的重要原则。