我正在从C#背景中学习更高级的javascript面向对象技术,想知道是否实现基于原型的验证是一个好主意,或者如何实现。例如当一个对象或函数需要其参数满足特定接口时,可以像下面这样检查其接口:
var Interface = function Interface(i) {
var satisfied = function (t, i) {
for (var key in i) {
if (typeof t !== 'object') {
return false;
}
if (!(key in t && typeof t[key] == i[key])) {
return false;
}
}
return true;
}
this.satisfiedBy = function (t) { return satisfied(t, i); }
}
// the interface
var interfacePoint2D = new Interface({
x: 'number',
y: 'number'
});
// see if it satisfies
var satisfied = interfacePoint2D.satisfiedBy(someObject);
我提出了一种策略,只通过其接口验证对象,忽略对象的内部实现。
另外,如果你正在使用基于原型的继承,你是否应该根据它们的原型函数来验证参数?我理解你会使用原型来实现默认功能,而接口不指定任何默认功能。有时,您传递到函数中的对象可能需要某些默认功能,以使该函数正常工作。是只针对接口进行验证更好,还是应该验证原型,如果是这样,最好的方法是什么?
编辑 - 我提供了更多上下文,解释为什么我在问这个问题,
例如,在在线游戏设计(大多数用JavaScript编写的游戏)中。我对此情况下的验证感兴趣的原因有两个主要原因,
1)如果需要,为修改游戏提供强大的公共API
2)防止(或至少大大减少)潜在的作弊行为
这需要在可定制性和滥用之间取得平衡。特别是在设计物理引擎时,游戏中的对象对重力产生反应。在真实系统中,用户不应能够添加不对重力产生反应的对象到系统中。该系统具有表达任何给定点处重力全局影响的功能:
function getGravityAt(x, y) {
// return acceleration due to gravity at this point
}
而具有反应性的对象有一个使用此方法来更新其加速度的方法:
function update() {
this.acceleration = getGravity(this.position);
}
最基本的做法可能是确保系统中添加的任何对象都有一个“更新”方法,但您仍然不能确保update()方法真的旨在对重力做出反应。如果只允许从原型更新()方法继承的对象,则至少可以知道系统中的所有内容都以某种程度上逼真地做出反应。