Я изучаю более продвинутую ОО-тактику для javascript, основанную на C #, и мне интересно, как это сделать, или даже хорошая идея реализовать проверку на основе прототипов. Например, когда объект или функция требует одного из своих параметров для удовлетворения определенного интерфейса, вы можете проверить его интерфейс следующим образом:
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', но вы все еще не гарантируете, что метод update () действительно предназначен для реакции на гравитацию. Если разрешены только объекты, которые наследуются от прототипного метода update (), то вы знаете, по крайней мере, до некоторой степени, что все в системе реагирует реалистично.