为什么我无法访问原型函数(使用闭包)?

时间:2016-09-08 09:53:15

标签: javascript closures

我正在尝试创建函数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();
  }
}

有两个错误。

2 个答案:

答案 0 :(得分:2)

  

我需要对此进行测试。

首次调用init()时,this等于test。问题是stringSplitstringSearch只是变量,与当前上下文无关。

无论哪种方式,代码都很难理解。如果您真的要覆盖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}访问它们对象。