Javascript:封装状态,暴露行为

时间:2014-12-20 11:59:30

标签: javascript oop functional-programming encapsulation

我正在尝试改进我的Javascript基础,以便我可以探索客户端框架(Knockout,Angular等)并在学习Node.js方面取得进展。

我在教授C#时遇到了一个简单的问题,我正试图用Javascript解决它。

  

问题

     

创建具有可能性百分比内部值的概率对象。例如,将使用以下内容创建2/5概率:

var firstOne = new Probability(40); // 2/5 is a 40% chance
  

不应通过实例变量访问该内部状态。概率函数/对象的目的是封装将一个与另一个进行比较的能力:

var secondOne = new Probability(30);
var areTheyEqual = firstOne.SameAs(secondOne); // returns false in this example

在C#中,这是相对简单的。概率值存储在具有私有范围的成员变量中,而SameAs函数是公共范围。因为每个实例使用相同的类型,概率,C#的范围允许调用成员也“看到”传递的成员的私有状态:

// C#
public class Probability
{
    private int _value;

    public Probability(int percent)
    {
        _value = percent;
    }

    public bool SameAs(Probability other)
    {
        return this._value == other._value; // works even though _value is private
    }
}

我想知道是否可以使用Javascript实现这种封装。作为第二个问题,也许我正在尝试做的是从C#和OO的角度来看,Javascript可以提供替代方法来解决利用Javascript功能的问题。我对两种类型的回应持开放态度。

1 个答案:

答案 0 :(得分:0)

您可以使用JavaScript闭包来接近您在其他面向对象语言中使用的内容,例如:类似的东西:

function Probability() {
// private field
    var _value = 0;
    this.getValue = function() {
        return _value;
    };

    this.setValue = function(newValue) {
       _value = newValue;
    };

    this.sameAs = function(compare) {
        return _value === compare.getValue();
    };
}

var probability = new Probability();
probability.setValue(10);

var newProbability= new Probability();
newProbability.setValue(11);

console.log(probability.sameAs(newProbability)); // false
newProbability.setValue(10);
console.log(probability.sameAs(newProbability)); // true

在谷歌搜索面向对象的JavaScript时,你可以找到很多参考资料,我可以推荐this site