将对象this发送到不带参数的函数

Send object this to functions that take No-arguments

本文关键字:参数 函数 对象 this      更新时间:2023-10-13

如何将参数this发送到函数。以上选项在构造函数中工作:

selectors[i].onblur = this.validation;

但如果在函数Valid中,我调用选择器[i].validation,上述解决方案将不起作用。有人知道如何用参数this调用选择器[i].validation吗??

如果有任何帮助,我将不胜感激。

演示链接:http://codepen.io/anon/pen/YqryVr

我的js类:

var Validator = (function () {
    var errorClassName = "error";
    var selectors;
    var regexMap;
    function Validator(id, regexObject) {      
        if (id === void 0) { id = "form"; }
        regexMap = regexObject.getMap();
        selectors = document.getElementById(id).elements;
        for (i = 0; i < selectors.length; ++i) {   
            selectors[i].onblur = this.validation;
        }
    };
    Validator.prototype.setErrorClassName = function (className) { 
        errorClassName = className;
    };
    Validator.prototype.addClass = function (selector) {
        if(selector.className.indexOf(errorClassName) < 1)
            selector.className += " " + errorClassName;
    };
    Validator.prototype.removeClass = function (selector) {
        selector.className = selector.className.replace(errorClassName, '');
    };

     Validator.prototype.validation = function () { 
        alert('this.type: ' + this.type);
        switch(this.type) {
            case 'textarea':
            case 'text':
                if(this.dataset.regex in regexMap) this.dataset.regex = regexMap[this.dataset.regex];
                var pattern = new RegExp(this.dataset.regex);
                if(this.value.length !== 0 && pattern.test(this.value)) {
                    Validator.prototype.removeClass(this);
                    return true;
                } else {
                    Validator.prototype.addClass(this);
                    return false;
                }
            break;
            case 'select-one':
                if(this.value.length === 0) {
                    Validator.prototype.addClass(this);
                    return false;
                } else { 
                    Validator.prototype.removeClass(this);
                     return true;
                }
            break;    
        }
        return true;
    };
    Validator.prototype.valid = function () {
        for (i = 0; i < selectors.length; ++i) {
           selectors[i].validation;
        }
        return true;
    };
    return Validator;
}());
var SelectorAttribute = (function () {
    function SelectorAttribute(name, regex) {
        this.name = name;
        this.regex = regex;
    }
    SelectorAttribute.prototype.toString = function () {
        return "name: " + this.name + ", regex = " + this.regex;
    };
    return SelectorAttribute;
}());
var StandardRegexPatterns = (function () {
    var map = {};
    function StandardRegexPatterns() {
        map['zip-code-poland'] = '^[0-9]{2}-[0-9]{3}$';
        map['phone-number-poland'] = '^[0-9]{9}$';
        map['digits'] = '^[0-9]+$';
        map['alpha'] = '^[a-zA-z]+$';
        map['email'] = '^[-a-z0-9~!$%^&*_=+}{''?]+('.[-a-z0-9~!$%^&*_=+}{''?]+)*@([a-z0-9_][-a-z0-9_]*('.[-a-z0-9_]+)*'.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}'.[0-9]{1,3}'.[0-9]{1,3}'.[0-9]{1,3}))(:[0-9]{1,5})?';
        map['login'] = '^[a-z0-9_-'.]{3,21}$';
        map['ip-address'] = '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$';
        map['url-address'] = '^((http[s]?|ftp):'/)?'/?([^:'/'s]+)(('/'w+)*'/)(['w'-'.]+[^#?'s]+)(.*)?(#['w'-]+)?$';
    }
    StandardRegexPatterns.prototype.getMap = function () {
        return map;
    };
    return StandardRegexPatterns;
}());

$( document ).ready(function() {
    var validator = new Validator('form', new StandardRegexPatterns());
    validator.setErrorClassName("error");

   //var pattern = new StandardRegexPatterns();
   // alert(Object.keys(pattern.getMap()));
    $("button").on('click', function(){
        alert(validator.valid());
      });
});

您可以使用以下内容:

functionname.apply(this, [arguments]);

functionname.call(this, argument1, argument2);

如果你没有论据,你可以省略它们。

我通常只是这样做:

funcitonname.apply(this, Arguments);

如果我已经在函数中调用了这个方法,那么我就可以继续functionname()的参数。

了解有关apply 的更多信息

了解有关call 的更多信息