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

我还在学习JavaScript的怪癖。

所以我有一个“类”,或者像下面这样创build的函数:

function Parser(){ .... } Parser.prototype = { init: function(){...}, parseChar: {} } 

然后,我将parseChar对象的一些子方法添加到原型中,如下所示:

 Parser.prototype.parseChar["*"] = function(){...} Parser.prototype.parseChar["/"] = function(){...} 

那么我怎样才能使这些函数内的引用指向Parser创build的实例呢? 而不是对象parseChar

我试过了:

 Parser.prototype.parseChar["*"] = function(){...}.bind(??) 

我猜这显然是行不通的,因为这个例子现在还不存在。

我只是希望这个引用能够引用每个相应的实例,以便能够访问这些原型函数内部的parsing器的属性。

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


当前代码

 function Parser(){ var that = this; } Parser.prototype = { state: {...}, parseChar: {}, init: function(){}, parse: function(fileName){ //random stuff } } Parser.prototype.parseChar["*"] = function(){ console.log(that); } 

然后在另一个testing文件中:

 var Parser = require('./Parser.js'); var parser = new Parser(); parser.parse("Parser.js"); 

顺便说一下,这是node.js;)


潜在的解决scheme

看起来这样解决了我的问题 ,不 ,虽然我还不确定这是最好的解决scheme,所以我现在还不会接受它。

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

 //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); } } 

现在,在原型方法中,我可以添加如下内容:

 console.log(this.state); 

它工作。

我可以预见这种方法存在两个问题中的一个。 如果其中任何一个是正确的或不正确的,请告诉我!

1) 这个方法有效,但是它实际上在每个对象上创build了一个函数的实例。 在这种情况下,最小化原型所带来的冗余实例化的整个吸引力消失了。 这样可以,但是我不会创build太多的实例,我喜欢这个解决scheme的可读性。

不是这样的。 每个实例仍然调用原型的方法

2) 每次创build一个新的实例时,它实际上将原型的方法绑定到实际的实例,因此如果我创build了多个Parser实例,那么在原型方法绑定到新实例及其所有属性之后,所有先前的实例然后会参考最新的。 而那会很糟糕。

几乎,除了相反。 出于某种原因,每个后续实例引用第一个,而不是最新创build的

仍在寻找解决scheme…

以下可能是一个解决scheme:

 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['*'](); 

在你的第二块,你尝试使用闭包来获得这个值。 只有当该variables与使用thatvariables的函数处于相同的function块中时,它才起作用。

你可以做下面的事情,但是它会为每个parsing器实例创build闭包和parseChar函数,所以在我看来这不像这个答案中提到的第一个解决scheme那么好。

 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); } } } 

更多信息在这里的原型和构造函数。

更多信息在这里closures。

如果你创build一个单一的closures只是为了回报?

在你的Parser里面:

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

然后使用self()