문제

Validators 플러그인과 함께 jQuery를 사용하고 있습니다. "필수"유효성 검사기를 내 자신의 하나로 바꾸고 싶습니다. 이것은 쉬워요:

jQuery.validator.addMethod("required", function(value, element, param) {
    return myRequired(value, element, param);
}, jQuery.validator.messages.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(value, element, param);
}, jQuery.validator.messages.required);

유효성 검사기의 소스 코드를 살펴보고 "필수"의 기본 구현은 jQuery.validator.messages.Required에서 익명 메소드로 정의됩니다. 따라서 내가 사용할 수있는 기능에 대한 다른 (익명) 참조는 없습니다.

AddMethod를 호출하고 해당 참조를 통해 기본 유효성 검사기를 호출하기 전에 기능에 대한 참조를 저장하면 차이가 없습니다.

내가 정말로해야 할 일은 기본 필수 유효성 검사기 기능을 참조 대신 값으로 복사 할 수 있어야합니다. 그러나 약간의 검색 후에, 나는 그렇게하는 방법을 알 수 없습니다. 가능합니까?

불가능하다면 원래 함수의 소스를 복사 할 수 있습니다. 그러나 그것은 유지 보수 문제를 일으키고, "더 나은 방법"이 없다면 오히려 그렇게하지 않을 것입니다.

도움이 되었습니까?

해결책

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);

다른 팁

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 ()를 사용하는 것은 완전히 바보이며 너무 길고 기능 생성자는 동일합니다. literrals가 훨씬 좋습니다. 또한 jQuery를 포함하여 제대로 작동하지 않는다면 (그리고 그것이 그렇게 생각하지 않는다면) 가장 밝은 일이 아닙니다.

다음은 업데이트 된 답변입니다

var newFunc = oldFunc.bind({}); //clones the function with '{}' acting as it's new 'this' parameter

그러나 .Bind는 JavaScript의 새로운 기능이지만 MDN의 해결 방법이 있습니다.

https://developer.mozilla.org/en/javascript/reference/global_objects/function/bind

또한 기능 추가 특성을 복제하지 않습니다.

메모: @gsnedder가 지적했듯이 : "이"인수 U는 (위의 공백 {}) apply ()/call () 함수를 통한 과잉 라이딩에 관계없이 기능의 향후 호출에 대해 지속됩니다.

이것은 당신의 이점에 따라 당신의 유리한 점 또는 단점에 따라 사용될 수 있습니다.

나는 당신이 약간의 범위를 놓치고 있다고 생각합니다. 이 시도:

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);

(이것은 단지 의견 일뿐입니다 JavaScript에서 함수를 복사/복제 할 수 있습니까? ... 불행히도 Rep <50을 사용하면 게시 할 수 있습니다)

Function.prototype.clone=function(){
    return eval( '('+this.toString()+')' );
}

충분하거나 심지어

Object.prototype.clone=function(){
    return eval( '('+this.toString()+')' );
}

효율성에 대한 생각 :

  • 인적 효율성은 기계의 "생명"을 최적화하거나 개선하기 위해 인적 자원을 낭비하는 것보다 훨씬 중요합니다.
  • 컴퓨터와 자동화 시스템은 인간의 노력을 줄여야합니다.
  • 계산 오버 헤드는 많은 사람들이 인간 소비에 대한 결과의 사소성에 심각하게 영향을 미쳐서, 종종 더 모호하고 무례하고 난해한 코드를 최적화하는 투자 노력을 정당화해야합니다. 논리를 "이해"합니다

복제시 :이 질문은 상당히 수사적 일 수 있습니다

  • JavaScript 객체를 "클론"한다는 것은 무엇을 의미합니까? 특히 재귀 기능 이론의 맥락에서
    • 복제를 합리화하는 일반적인 주제는 Doppelgänger가 변경하여 원문자를 분리하고 "보호"한다는 것입니다.
    • 만약에 a = new Object(); b = new Object(); ~이다 a 그리고 b 클론? 어때 o = Object; a = new o(); b = new o();
  • 정말로 필요합니까?
  • 복제는 어디에서 멈추나요? 프로토 타입 속성을 분리해야하므로 복제 된 물체의 변경은 복제 된 물체와 관련이없는 인스턴스에 영향을 미치지 않습니까? 이 경우 클로닝은 프로토 타입 체인을 원시 생성자로 올라가야하는데, 그 자체는 어떻게 든 복제되고 분리되어야하는 원시 생성자로 가야합니다 (브라우저의 한 가지 트릭은 새 창을 열고 경고로 다시 채워야합니다. opener . 등. 여전히 교차 효과를 누출 할 수 있습니다)

기능을 복제하려면 다음을 시도하십시오.

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'};

`

좋은 JS 엔진에서 실행 속도가 느리지 않는지 확인하기 위해 여러 테스트를 실행합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top