我想知道这是否是初始化对象的正确方法,它需要 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/