Voici un test de référence sur la fonction de surcharge - http://goo.gl/UyYAD (code indiqué dans ce post). Il montre que la fonction de surcharge (en prenant les types de compte) peut être autour de 13 fois plus lent dans Google Chrome V8 de 16.0(bêta).
Ainsi que le passage d'un objet (c - {x: 0, y: 0}
), on peut aussi prendre le C approche cas échéant, de nommer les méthodes en conséquence. Par exemple, le Vecteur.AddVector(vecteur), Vecteur.AddIntegers(x, y, z, ...) et de Vecteur.AddArray(integerArray). Vous pouvez regarder les bibliothèques C, telles que OpenGL pour le nommage de l'inspiration.
Edit: j'ai ajouté une référence pour le passage d'un objet et d'essais pour l'objet à l'aide de deux 'param' in arg
et arg.hasOwnProperty('param')
, et la fonction de surcharge est beaucoup plus rapide que de passer un objet et la vérification de propriétés (dans ce cas-test au moins).
À partir d'une conception de point de vue, la fonction de surcharge n'est valable que logique ou si la surcharge des paramètres correspondent à la même action. Il va de soi qu'il doit y avoir un sous-jacente méthode qui n'est concerné avec des détails précis, sinon ça peut indiquer inapproprié des choix de conception. Donc, on pourrait également résoudre l'utilisation de la surcharge de fonction par la conversion des données à l'objet concerné. Bien sûr, il faut tenir compte de l'étendue du problème comme il n'y a pas besoin d'en faire des dessins si votre intention est simplement d'imprimer un nom, mais pour la conception de cadres et de bibliothèques telles pensée est justifiée.
Mon exemple est tiré d'un Rectangle de mise en œuvre - d'où la mention de la Dimension et de Point de. Peut-être Rectangle pourrait ajouter un GetRectangle()
méthode de l' Dimension
et Point
prototype, et ensuite la fonction de surcharge question est triée. Et que dire de primitives? Eh bien, nous avons argument de la longueur, qui est maintenant un test valide puisque les objets ont un GetRectangle()
méthode.
function Dimension() {}
function Point() {}
var Util = {};
Util.Redirect = function (args, func) {
'use strict';
var REDIRECT_ARGUMENT_COUNT = 2;
if(arguments.length - REDIRECT_ARGUMENT_COUNT !== args.length) {
return null;
}
for(var i = REDIRECT_ARGUMENT_COUNT; i < arguments.length; ++i) {
var argsIndex = i-REDIRECT_ARGUMENT_COUNT;
var currentArgument = args[argsIndex];
var currentType = arguments[i];
if(typeof(currentType) === 'object') {
currentType = currentType.constructor;
}
if(typeof(currentType) === 'number') {
currentType = 'number';
}
if(typeof(currentType) === 'string' && currentType === '') {
currentType = 'string';
}
if(typeof(currentType) === 'function') {
if(!(currentArgument instanceof currentType)) {
return null;
}
} else {
if(typeof(currentArgument) !== currentType) {
return null;
}
}
}
return [func.apply(this, args)];
}
function FuncPoint(point) {}
function FuncDimension(dimension) {}
function FuncDimensionPoint(dimension, point) {}
function FuncXYWidthHeight(x, y, width, height) { }
function Func() {
Util.Redirect(arguments, FuncPoint, Point);
Util.Redirect(arguments, FuncDimension, Dimension);
Util.Redirect(arguments, FuncDimensionPoint, Dimension, Point);
Util.Redirect(arguments, FuncXYWidthHeight, 0, 0, 0, 0);
}
Func(new Point());
Func(new Dimension());
Func(new Dimension(), new Point());
Func(0, 0, 0, 0);