Я не вижу этого в приведенных выше ответах, поэтому я предположим, что здесь, я думаю.
function isDefined(x) { return !!x }
if( isDefined(x) ) {
//The variable is defined
}
! x вернет true, если x равно либо null, либо undefined, так что! ! x вернет true, если x не является ни неопределенным, ни нулевым.
Я понимаю, что это также объясняет нулевой случай, но вот справедливое предупреждение об этом.
Хранение ссылки на функцию внешне прежде, чем назвать addMethod и назвать блок проверки допустимости по умолчанию через ту ссылку не имеет никакого значения.
Это точно, что должен работать .
jQuery.validator.methods.oldRequired = jQuery.validator.methods.required;
jQuery.validator.addMethod("required", function(value, element, param) {
// handle comboboxes with empty guids
if (someTest(element)) {
return myRequired(value, element, param);
}
return jQuery.validator.methods.oldRequired(value, element, param);
}, jQuery.validator.messages.required);
Это должно работать также: (И проблема с this
решена)
var oldRequired = jQuery.validator.methods.required;
jQuery.validator.addMethod("required", function(value, element, param) {
// handle comboboxes with empty guids
if (someTest(element)) {
return myRequired(value, element, param);
}
return oldRequired.call(this, value, element, param);
// return jQuery.oldRequired.apply(this, arguments);
}, jQuery.validator.messages.required);
Я думаю, что Вы просто пропускаете немного обзора. Попробуйте это:
jQuery.validator.methods._required = jQuery.validator.methods.required;
jQuery.validator.addMethod("required", function(value, element, param) {
// handle comboboxes with empty guids
if (someTest(element)) {
return myRequired(value, element, param);
}
return jQuery.validator.methods._required.call(this, value, element, param);
}, jQuery.validator.messages.required);
если Вы хотите клонировать функцию, попробуйте это:
Function.prototype.clone=function(){
return eval('['+this.toString()+']')[0];
}
Кажется, что нет никакого 'лучшего пути'. Я предполагаю, что Вы могли попытаться делать пользовательскую необходимую функцию для своего собственного, например:
jQuery.validator.addMethod("customRequired", function(value, element, param) {
return myRequired(value, element, param);
}, jQuery.validator.messages.required);
Кажется, что Вы уже попробовали все остальное. Извинения, если я неправильно понял вопрос.
Отвечая на предыдущий пост, когда мне нужно поделиться функцией конструктора, сохраняя отдельный прототип, я использую оболочку в новой функции:
`
init_from_arg_obj = function () {
return new Function('init', 'for (var i in init) this[i] = init[i];');
};
constructor_A = init_from_arg_obj();
constructor_A.prototype = {a: 'A'};
constructor_B = init_from_arg_obj();
constructor_B.prototype = {b: 'B'};
`
I запустите несколько тестов, чтобы убедиться, что это не замедляет выполнение на хороших машинах JS.
Function.prototype.clone = function() {
var fct = this;
var clone = function() {
return fct.apply(this, arguments);
};
clone.prototype = fct.prototype;
for (property in fct) {
if (fct.hasOwnProperty(property) && property !== 'prototype') {
clone[property] = fct[property];
}
}
return clone;
};
Плохо только то, что прототип не клонирован, поэтому вы не можете его изменить ... Я работаю над способом клонирования любого типа объектов, и у меня просто есть Осталось сделать RegExp. Так что завтра я, вероятно, отредактирую и вставлю весь код (который довольно длинный и не оптимизирован, если вы используете его только для функций и объектов.
И чтобы прокомментировать другие ответов, использование eval () совершенно глупо и слишком длинно, а конструктор функций такой же. Литеральные значения намного лучше. И включение JQuery только для этого, более того, если он не работает должным образом ( и я не думаю, что это так) не самое лучшее, что вы можете сделать.