Javascript 我可以将几个原型方法绑定到对象实例吗?
我仍然在学习javascript的一些怪癖 因此,我创建了一个“类”或函数,如下所示:Javascript 我可以将几个原型方法绑定到对象实例吗?,javascript,node.js,Javascript,Node.js,我仍然在学习javascript的一些怪癖 因此,我创建了一个“类”或函数,如下所示: function Parser(){ .... } Parser.prototype = { init: function(){...}, parseChar: {} } 然后,我将parseChar对象的一些子方法添加到原型中,如下所示: Parser.prototype.parseChar["*"] = function(){...} Parser.prototype.pars
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
引用,但这是否首先否定了原型的使用?当使用时,会在每个实例上创建一个新函数吗?