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

我正在尝试使用两种公共方法定义一个类.碰巧其中一种方法对于实现另一种方法很有用,但对于我的生活,我无法在另一种方法的范围内识别该功能.我不知道这是否是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]);

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

[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

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

如何在addSeveral()中调用addOne()?

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

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

…或者只是使用常规循环,这将有更好的性能 – 函数调用是昂贵的.

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

转载注明原文:Node.js:不能从另一个调用一个Javascript原型方法? - 代码日志