我违反了面向对象的封装原则吗?

时间:2015-06-14 19:49:41

标签: javascript oop

我想知道这是否是初始化对象的正确方法,这需要在地图上随机定位和加速。我不确定我是否通过分别调用Warrior.chooseX()和Warrior.choosey()来使用对象初始化器this.x和thi.y来违反封装原则。

var Warrior = function() {
    this.x = Warrior.chooseX();
    this.y = Warrior.chooseY();
    this.speed = Warrior.chooseSpeed();
};

Warrior.chooseX = function() {
    return Math.random() * 600 - 200;
};

Warrior.chooseY = function() {
    var randomNumber = Math.random();

    if (0 <= randomNumber && randomNumber < 0.5) {
        return 100;
    } else {
        return 200;
    }
};

Warrior.chooseSpeed = function() {
    return Math.floor(Math.random() * 200) + 100;
};

var warrior = new Warrior();

感谢您的任何建议。

1 个答案:

答案 0 :(得分:3)

封装原则是关于限制对象的某些部分(例如,内部操作或不应从对象外部获得的字段)。共同的理解也是使用访问器来访问字段。

Javascript不提供任何允许限制对字段或方法的访问的机制。但是,可以使用Module pattern来实现它。

在您的示例中,所有字段和方法都是公开的。有些人可能会争辩说你不使用访问器(x和y的getter / setter对),但我个人的观点是它不会以任何方式使你的代码受益。此外,通过赋值运算符和setter函数访问变量最终可能被JIT编译为完全相同的代码(至少,这是Java中发生的情况)。在静态类型语言中,使用访问器可能很好的原因有很多,但大多数都不适用于javascript。

TL;博士

你的代码很好。