Я могу копировать/клонировать функцию в JavaScript?

Я не вижу этого в приведенных выше ответах, поэтому я предположим, что здесь, я думаю.

function isDefined(x) { return !!x }

if( isDefined(x) ) {
    //The variable is defined
}

! x вернет true, если x равно либо null, либо undefined, так что! ! x вернет true, если x не является ни неопределенным, ни нулевым.

Я понимаю, что это также объясняет нулевой случай, но вот справедливое предупреждение об этом.

20
задан Craig Stuntz 15 January 2009 в 18:17
поделиться

6 ответов

Хранение ссылки на функцию внешне прежде, чем назвать 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);
18
ответ дан 29 November 2019 в 23:41
поделиться

Я думаю, что Вы просто пропускаете немного обзора. Попробуйте это:

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);
4
ответ дан 29 November 2019 в 23:41
поделиться

если Вы хотите клонировать функцию, попробуйте это:

Function.prototype.clone=function(){
    return eval('['+this.toString()+']')[0];
}
2
ответ дан 29 November 2019 в 23:41
поделиться

Кажется, что нет никакого 'лучшего пути'. Я предполагаю, что Вы могли попытаться делать пользовательскую необходимую функцию для своего собственного, например:

jQuery.validator.addMethod("customRequired", function(value, element, param) {
  return myRequired(value, element, param);
}, jQuery.validator.messages.required);

Кажется, что Вы уже попробовали все остальное. Извинения, если я неправильно понял вопрос.

1
ответ дан 29 November 2019 в 23:41
поделиться

Отвечая на предыдущий пост, когда мне нужно поделиться функцией конструктора, сохраняя отдельный прототип, я использую оболочку в новой функции:

`

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.

0
ответ дан 29 November 2019 в 23:41
поделиться
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 только для этого, более того, если он не работает должным образом ( и я не думаю, что это так) не самое лучшее, что вы можете сделать.

9
ответ дан 29 November 2019 в 23:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: