javascript - 我是否违反了面向对象的封装原则?

标签 javascript oop

我想知道这是否是初始化对象的正确方法,它需要 map 上的随机位置和速度。我不确定我分别调用 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();

感谢您的任何建议。

最佳答案

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

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

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

tl;博士

你的代码没问题。

关于javascript - 我是否违反了面向对象的封装原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30833807/

相关文章:

javascript - jQuery UI 无法在选项卡中工作

javascript - typescript 泛型 : Use output argument type to build input argument type

oop - 为什么几乎所有的面向对象语言都编译为字节码?

c++ - 我们可以使用关键字 struct 来实现 OOPS 的所有概念吗?

python - 如何仅允许特定类的元素成为可迭代的元素(对于自定义类)

java - 将 TreeMap 的键存储在值中(java)

javascript - jQuery Slideshow - 在一张幻灯片处于事件状态时隐藏其他幻灯片

facebook - Facebook friends_get 函数的问题

c#属性问题

javascript - document.write 上的对象 HTMLTextAreaElement javascript 响应