简体   繁体   English

一起运行多个javascript对象方法

[英]Running multiple javascript object methods together

I am trying to write a little helper class for my ajax chat system i am working on just trying to add basic functions that i may need. 我正在尝试为我的Ajax聊天系统编写一个小帮助程序类,而我只是在尝试添加我可能需要的基本功能。

var strings = {
        filterWords: ["fool", "dumb", "arse"],
        removeSpecialChars: function (str) {
            return str.replace(/[^\w\s]/gi, '');
        },
        killSpace: function (str) {
            return str.replace(/\s/g, '');
        },
        reduceSpace: function (str) {
            return str.replace(/\s+/g, ' ');
        },
        allowLetsAndNums: function (str) {
            return str.replace(/[^A-Za-z0-9]/g, ' ');
        },
        allowLets: function (str) {
            return str.replace(/[^A-Za-z]/g, ' ');
        },
        allowNums: function (str) {
            return str.replace(/[^0-9]/g, ' ');
        },
        wordFilter: function (str) {
            var rgx = new RegExp(this.filterWords.join("|"), "gi");
            return str.replace(rgx, "****");
        }
    }

What i am finding is i may need to run multiple methods together i am asking whats the best practise to do this without resulting with below? 我发现的是,我可能需要同时运行多种方法,我问这样做的最佳实践是什么?

alert(strings.wordFilter(strings.reduceSpace(strings.allowLets("efgwge @£235%^@£ fool you a dumb arse432345$%^"))));

Thanks 谢谢

You could make this a fluent interface, allowing code like this: 您可以使它成为一个流畅的界面,并允许如下代码:

var x = new Validation("efgwge @£235%^@£ fool you a dumb arse432345$%^");
alert(x.allowLets().reduceSpace().wordFilter().result());
// alerts "efgwge **** you a **** ****"

Your main code would need to be: 您的主要代码应为:

var Validation = function(str) {
    this.str = str;
    filterWords = ["fool", "dumb", "arse"]
    this.removeSpecialChars = function () {
        this.str = this.str.replace(/[^\w\s]/gi, '');
        return this;
    };    
    this.killSpace = function () {
        this.str = this.str.replace(/\s/g, '');
        return this;
    };
    this.reduceSpace = function () {
        this.str = this.str.replace(/\s+/g, ' ');
        return this;
    };
    this.allowLetsAndNums = function () {
        this.str = this.str.replace(/[^A-Za-z0-9]/g, ' ');
        return this;
    };
    this.allowLets = function () {
        this.str = this.str.replace(/[^A-Za-z]/g, ' ');
        return this;
    };
    this.allowNums = function () {
        this.str = this.str.replace(/[^0-9]/g, ' ');
        return this;
    };
    this.wordFilter = function () {
        var rgx = new RegExp(filterWords.join("|"), "gi");
        this.str = this.str.replace(rgx, "****");
        return this;
    };
    this.result = function(){
        return this.str;
    };
}

Live example: http://jsfiddle.net/fb7en/ 实时示例: http//jsfiddle.net/fb7en/

You could extend the String prototype: 您可以扩展String原型:

String.prototype.removeSpecialChars = function () {
return this.replace(/[^\w\s]/gi, '');
}
String.prototype.killSpace = function () {
return this.replace(/\s/g, '');
}

var foo = "This is my§$% String";
​document.write​(foo.removeSpecialChars​().killSpace());​

You could add the functions to the String.prototype so you can call the functions like this: 您可以将这些函数添加到String.prototype中,以便可以像这样调用这些函数:

String.prototype.killSpace = function() {
  return this.replace(/\s/g, '');
}
String.prototype.reduceSpace = function () {
  return this.replace(/\s+/g, ' ');
}

"foo   bar".reduceSpace().killSpace(); // => returns foobar

Only downside to this is that you can't iterate over a string with a for..in loop then because it will list the method as a member and there's currently no cross-browser way to make it non-iterable (IE doesn't support it). 唯一的缺点是您不能使用for..in循环遍历字符串,因为它将方法列为成员,并且目前没有跨浏览器的方法使其不可迭代(IE不会支持它)。

You might consider a chainable API for your Object: 您可以考虑为对象使用可链接的API:

var StringFilter = {
    _string: '',
    string: function (string) {
        this._string = string || '';
        return this;
    },
    filterWords: ["fool", "dumb", "arse"],
    removeSpecialChars: function () {
        this._string = this._string.replace(/[^\w\s]/gi, '');
        return this;
    },
    killSpace: function () {
        this._string = this._string.replace(/\s/g, '');
        return this;
    },
    reduceSpace: function () {
        this._string = this._string.replace(/\s+/g, ' ');
        return this;
    },
    allowLetsAndNums: function () {
        this._string = this._string.replace(/[^A-Za-z0-9]/g, ' ');
        return this;
    },
    allowLets: function () {
        this._string = this._string.replace(/[^A-Za-z]/g, ' ');
        return this;
    },
    allowNums: function () {
        this._string = this._string.replace(/[^0-9]/g, ' ');
        return this;
    },
    wordFilter: function () {
        var rgx = new RegExp(this.filterWords.join("|"), "gi");
        this._string = this._string.replace(rgx, "****");
        return this;
    },
    select: function () {
        return this._string;
    }
};

StringFilter
    .string("efgwge @£235%^@£ fool you a dumb arse432345$%^")
    .allowLets()
    .reduceSpace()
    .wordFilter()
    .select();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM