我正在尝试创建函数findStrings,它应该与函数init,stringSplit和stringSearch共享它的变量。
String.prototype.findStrings = (function () {
var action = 'split';
var params = ',';
var init = function (action = 'split', params = ',')
{ this.stringSplit(); }
var stringSplit = function (action)
{ return this.init(); }
var stringSearch = function (action)
{return this.init(); }
return init;
})();
我需要什么。
当我调用test.findStrings('split');
时,它应该1)通过调用init来启动变量2)然后调用stringSplit,所以这个应该是字符串 test 。
当我调用var result = test.findStrings( 'search', { params ... } );
时1)启动变量,处理来自对象参数的参数2)然后调用stringsSearch和这个应该 test 。
var test = '#a > :matches(.b, #c)';
test.findStrings('split', "," );
var result = test.findStrings( 'search', { params ... } );
我得到的错误是说这个没有stringSplit(因为这是Window),我需要这个是 test
如何访问函数中的 test 字符串,并且可以访问其中的变量和参数?
实际上,我可以删除函数searchStrings来简化它。
解决方案:
String.prototype.findStrings = (function () {
var text = this;
...
String.prototype.init = function (action = 'split', params = ',') {
text.stringSplit();
}
}
有两个错误。
答案 0 :(得分:2)
我需要对此进行测试。
首次调用init()
时,this
等于test
。问题是stringSplit
和stringSearch
只是变量,与当前上下文无关。
无论哪种方式,代码都很难理解。如果您真的要覆盖String
,那么为什么不做以下事情:
String.prototype.findStrings = function(action = 'split', params = ',') {
// do logic here (not entirely sure what you want to accomplish)
return (action === 'split') ? this.stringSplit() : this.stringSearch();
}
// Add other functions also to string prototype
String.prototype.stringSplit = function() { ... }
String.prototype.stringSearch = function() { ... }
就个人而言,我不想出于各种原因向String
等类型添加方法。为什么不采用更具功能性的方法,创建简单地传递字符串的函数,并获得适当的结果?
例如:
function findStrings(str, params){
// do logic and return result
}
答案 1 :(得分:0)
首先,您的代码中有一个循环引用:init
函数调用stringSplit
,调用init
。
但要解决该问题,您应该从原型函数中删除this
关键字。 this
将获取调用函数的对象的值,在您的情况下是window
对象,但是您的函数是在闭包中创建的,因此您无法使用{{1}访问它们对象。