Node.js:不能从另一个调用一个Javascript原型方法?

Jas*_*ack 3 javascript prototype node.js

我正在尝试使用两种公共方法定义一个类.碰巧其中一种方法对于实现另一种方法很有用,但对于我的生活,我无法在另一种方法的范围内识别该功能.我不知道这是否是node.js特有的,但是如果重要的话,这是在node下运行的.

这是一个简短的玩具问题,它重现了我所看到的行为:

function Foo() {
    this.list = [];
}

Foo.prototype = {
    addSeveral: function(arr) { arr.forEach(function(v) { addOne(v)} ) },
    addOne: function(item) { list.push(item); }
}

f = new Foo();
f.addSeveral([1,2,3]);
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它会爆炸:

[jasonb@localhost]$ node testobj.js

/home/jasonb/work/testobj.js:6
Foo.prototype.addSeveral = function(arr) { arr.forEach(function(v) { addOne(v)}
                                                                     ^
ReferenceError: addOne is not defined
    at /home/jasonb/work/entity_mapping/testobj.js:6:70
Run Code Online (Sandbox Code Playgroud)

我已经尝试了我可以找到的关于如何将东西分配给类的原型的每个变体,具有相同的结果.如果我试着打电话this.addOne(v),它仍然会爆炸,但是TypeError: Object #<Object> has no method 'addOne'

我怎么能叫addOne()addSeveral()

jos*_*736 9

因为forEach为数组的每个元素调用一个回调函数,所以你丢失了上下文(this不是Foo回调中的对象).你可以关闭一个参考:

Foo.prototype = {
    addSeveral: function(arr) { var self=this; arr.forEach(function(v) { self.addOne(v)} ) },
    addOne: function(item) { this.list.push(item); }
}
Run Code Online (Sandbox Code Playgroud)

...或者只是使用普通的循环,这将有很多更好的性能-函数调用是昂贵的.

addSeveral: function(arr) { for(var i = 0; i < arr.length; i++) this.addOne(arr[i]); };
Run Code Online (Sandbox Code Playgroud)