我需要在附加到协议之前将实例方法分组到对象中 但是,当我这样做时,“this”,现在指向对象,我无法访问实例变量。 请参阅以下代码以了解插图。
var events = require('events');
var Matcher = function Matcher(){
this.list3 = [];
events.EventEmitter.call(this);
};
require('util').inherits(Matcher, events.EventEmitter);
Matcher.prototype.vars = {
list1 : [ 1, 2 ],
list2 : [ 'foo', 'bar' ]
};
Matcher.prototype.protocols = {
print : function(ref){
console.log(" lists : ", this.list1, this.list2, this.list3 );
},
add : function(item){
this.vars.list1.push(item);
this.list3.push(item);
}
};
var matcher = new Matcher();
matcher.protocols.add( 23 );
matcher.protocols.print();
它给出了一个错误,因为this.vars.list1和this.list3都是未定义的。 很可能因为这指向协议对象而不是原型。
我很感激有关获取变量引用的任何帮助。
我试过以下
matcher.protocols.add( matcher, 'new item');
然后在add函数中我这样做,我使用matcher代替这个。 但这对我来说不合适。
答案 0 :(得分:0)
您可以重新排列函数定义,以包含Matcher
范围内的定义。这将允许您定义一个等于this
的私有变量,然后您可以在vars
和protocols
定义中访问该变量。
例如:
var events = require('events');
var Matcher = function Matcher(){
this.list3 = [];
events.EventEmitter.call(this);
this.vars = {
list1 : [ 1, 2 ],
list2 : [ 'foo', 'bar' ]
};
var matcher = this;
this.protocols = {
print : function(ref){
console.log(" lists : ", matcher.vars.list1, matcher.vars.list2, matcher.list3 );
},
add : function(item){
matcher.vars.list1.push(item);
matcher.list3.push(item);
}
};
};
require('util').inherits(Matcher, events.EventEmitter);
var matcher = new Matcher();
matcher.protocols.add( 23 );
matcher.protocols.print();
输出:
lists : [ 1, 2, 23 ] [ 'foo', 'bar' ] [ 23 ]