2012-12-04 83 views
3

我想用兩個公共方法來定義一個類。恰巧其中一種方法對實現另一種方法很有用,但對於我的生活而言,我無法讓這種功能在另一種方法的範圍內得到認可。我不知道這是否是特定於node.js的東西,但如果它很重要,這是在節點下運行。Node.js:不能從另一個調用一個Javascript原型方法?

下面是一個簡短的玩具問題,其再現了我所看到的行爲:

[[email protected]]$ 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 

我想盡我的變化:

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

當我運行它,它炸燬可以找到如何將東西分配給類的原型,並得到相同的結果。如果我嘗試調用this.addOne(v)相反,它仍然炸燬,但TypeError: Object #<Object> has no method 'addOne'

我怎麼能叫內addSeveral()addOne()

回答

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

...或者只是使用普通的循環,這將有更好的性能–函數調用是昂貴的。

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

號正如我所說,如果我公關將'this.'加入到方法名稱中,它會以不同的錯誤消失:'TypeError:Object# has no method'addOne'' –

+0

啊,就是這樣!謝謝! –

+1

考慮通過單擊複選標記來接受答案以將問題標記爲已回答。 – mtsr

1

你可以通過thisforEach

addSeveral: function (arr) { 
    arr.forEach(function (v) { 
    this.addOne(v) 
    }, this) 
} 

或者你可以使用綁定:

addSeveral: function (arr) { 
    arr.forEach((function (v) { 
    this.addOne(v) 
    }).bind(this)) 
} 

但我會做的是push.apply

addSeveral: function (arr) { 
    [].push.apply(this.list, arr) 
} 
相關問題