Javascript 我可以将几个原型方法绑定到对象实例吗?

Javascript 我可以将几个原型方法绑定到对象实例吗?,javascript,node.js,Javascript,Node.js,我仍然在学习javascript的一些怪癖 因此,我创建了一个“类”或函数,如下所示: function Parser(){ .... } Parser.prototype = { init: function(){...}, parseChar: {} } 然后,我将parseChar对象的一些子方法添加到原型中,如下所示: Parser.prototype.parseChar["*"] = function(){...} Parser.prototype.pars

我仍然在学习javascript的一些怪癖

因此,我创建了一个“类”或函数,如下所示:

function Parser(){
    ....
}

Parser.prototype = {
    init: function(){...},
    parseChar: {}
}
然后,我将
parseChar
对象的一些子方法添加到原型中,如下所示:

Parser.prototype.parseChar["*"] = function(){...}
Parser.prototype.parseChar["/"] = function(){...}
那么,如何使这些函数中的this引用引用
解析器的创建实例呢?对象
parseChar

我试过:

Parser.prototype.parseChar["*"] = function(){...}.bind(??)
我猜这显然行不通,因为这个实例在这一点上根本不存在

我只希望this引用引用每个相应的实例,以便能够访问这些原型函数中解析器的属性

我想这可能需要构造函数中的一些魔法?我不知道,我只是希望我不必从根本上改变这一点,因为我真的很喜欢用
Parser.prototype.语法定义函数的方式


当前代码

function Parser(){
    var that = this;

}

Parser.prototype = {
    state: {...},
    parseChar: {},
    init: function(){},
    parse: function(fileName){
        //random stuff
    }
}

Parser.prototype.parseChar["*"] = function(){
    console.log(that);
}
然后在另一个测试文件中:

var Parser = require('./Parser.js');
var parser = new Parser();
parser.parse("Parser.js");
顺便说一句,这里是node.js;)


潜在解决方案

看起来这解决了我的问题不,它没有,虽然我仍然不确定这是最好的解决方案,所以我现在还不打算接受它

在构造函数中,我添加了:

//Bind prototype methods to the instance
for (key in this.parseChar){
    var property = this.parseChar[key];

    if(this.parseChar[key] instanceof Function){
        this.parseChar[key] = this.parseChar[key].bind(this);
    }
}
现在,在prototype方法中,我可以添加如下内容:

console.log(this.state);
它是有效的

我可以预见这种方法的2个问题中的1个。如果正确或不正确,请告诉我

1)此方法有效,但实际上它会在每个对象上创建函数的实例。在这种情况下,最小化原型附带的冗余实例化的吸引力就消失了。不过这很好,因为我不会创建太多实例,而且我喜欢这个解决方案的可读性

情况并非如此。每个实例仍然调用原型的方法

2)每次创建一个新实例时,它实际上会将原型的方法绑定到该实际实例,因此如果我创建多个
解析器的实例,在原型方法绑定到新实例及其所有属性之后,所有前面的实例都会引用最新的实例。那就太糟糕了

几乎,除了反向。由于某些原因,每个连续实例都引用第一个实例,而不是最新创建的实例


仍在寻找解决方案…

以下可能是解决方案:

function ParseChar(parser){
  this.parser=parser;
}
ParseChar.prototype["*"] = function(){
    console.log(this.parser);
}


function Parser(name){
  //here is where you know the instance
  this.parseChar = new ParseChar(this);
  this.name=name;
}
Parser.prototype.init = function(){};

var p = new Parser('p');
p.parseChar['*']();
p1 = new Parser('p1');
p1.parseChar['*']();
在第二个块中,您尝试使用闭包来获取
this
的值。仅当
that
变量与使用
that
的函数位于同一功能块中时,该函数才起作用

您可以执行以下操作,但它会为每个解析器实例创建闭包和parseChar函数,因此在我看来,它不如本答案中提到的第一个解决方案好

function Parser(){
  //begin function block Parsers
  var that = this;
  this.parseChar = {
    //function using that is within the function
    //  declaring that so it is available now
    '*':function(){
      console.log(that);
    }
  }
}
关于原型和构造函数的更多信息


有关闭包的更多信息。

如果创建一个闭包只是为了返回
,该怎么办

解析器中

var that = this;
self: function {return that ;} 

然后使用
self()

var=this
作为
解析器()中的第一行。它将在函数的整个范围内可用。我已经添加了
var that=this
作为
Parser()
中的第一行,然后在
Parser.prototype.parseChar[“*”]中尝试了
console.log(that)
并收到未定义的
请发布您测试的代码。@PM77-1我猜这是因为这不是在“类”上创建原型方法的典型情况。原型方法是
parseChar
对象的子方法,其中不会定义
that
。假设在构造函数中我这样做:
this.parseChar[“*”]=this.parseChar[“*”].bind(this)
this似乎正确设置了
this
引用,但这是否首先否定了原型的使用?当使用时,会在每个实例上创建一个新函数吗?