سؤال

أنا باستخدام مسج مع المصادقون المساعد.أود أن تحل محل "مطلوب" المصادقة مع واحد من بلدي.هذا هو سهل:

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

نظرت إلى التعليمات البرمجية المصدر المصادقون ، الافتراضي تنفيذ "مطلوب" بأنه أسلوب غير معروف في مسج.المصادقة.رسائل.المطلوبة.لذلك لا يوجد الأخرى (غير مجهول) إشارة إلى وظيفة التي يمكن استخدامها.

تخزين إشارة إلى وظيفة خارجيا قبل استدعاء 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;
};

والشيء الوحيد السيئ مع ذلك هو أن النموذج الأولي ليست استنساخ بحيث لا يمكن تغييره حقا ... أنا أعمل على وسيلة لاستنساخ أي نوع من الأشياء وليس لدي سوى التعبير العادي تبقى القيام به. ولذا فإنني سوف ربما تعديل غدا ووضع رمز بأكمله (والذي هو نوع من فترة طويلة وليس هو الأمثل إذا كنت تستخدم فقط لوظائف والكائنات.

والتعليق إجابات أخرى، وذلك باستخدام وحدة التقييم () هو غبي TOTALY هو وسيلة لفترة طويلة والمنشئ وظيفة هو نوع من الشيء نفسه. Literrals هي أفضل بكثير. وبما مسج فقط لهذا، علاوة على ذلك إذا كان لا يعمل بشكل صحيح (وأنا لا أعتقد أنه يفعل) ليست هي ألمع شيء يمكنك القيام به.

هنا هو تحديث الإجابة

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

ومع ذلك .ربط ميزة جديدة من جافا سكريبت غير أن هناك حلا من Mdn

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

بالإضافة إلى ذلك فإنه لا استنساخ وظيفة خصائص إضافية.

ملاحظة: كما @gsnedder أشار إلى :ملزمة بيان "هذه" الحجة u الموردة (فارغة {} أعلاه).سوف تستمر أي مستقبل المكالمات وظيفة ، بغض النظر عن الإفراط في ركوب عبر تطبيق()/دعوة() وظائف.

هذا يمكن استخدامها على حد سواء لصالحك أو العيب اعتمادا على كيفية التعامل معها.

وأعتقد أنك فقط في عداد المفقودين قليلا من الفحص. جرب هذا:

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

(ينبغي أن يكون هذا فقط تعليق هل يمكنني نسخ/استنساخ وظيفة في جافا سكريبت ؟ ...للأسف مع مندوب < 50 فقط بعد)

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

ويكفي ، أو حتى

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

أفكار حول الكفاءة:

  • كفاءة الإنسان أهم بكثير من تبذير الإنسان الموارد إلى تحسين أو تطوير الجهاز "الحياة"
  • أجهزة الكمبيوتر والنظم الآلية المفترض أن تقلل من الجهد البشري لا زيادة عليه
  • الحسابية النفقات العامة يجب أن تؤثر بشدة على النتيجة استساغة للاستهلاك البشري ، من قبل العديد من الناس لتبرير الاستثمار الجهد في تحسين التعليمات البرمجية التي غالبا ما يصبح أكثر غموضا ، غامضة ، لذا الباطنية التي لا يمكن فهمها من قبل مستقر من المبرمجين بعد ساعات من محاولة "فهم" المنطق

الاستنساخ:هذا السؤال يمكن أن يكون تماما الخطابي

  • ما يعني أن "استنساخ" كائن جافا سكريبت?لا سيما في سياق وظيفة العودية نظرية
    • موضوع مشترك لترشيد الاستنساخ هو أنه يعزل و "يحمي" المنشئ من دوبلغنجر التغييرات
    • إذا 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