2011-06-23 29 views
1
base = function() { 
    this.A = function() { 
    this.B(); 
    } 
    var C = function() { 
    alert('I am C'); 
    } 
} 

sub = function() { 
    this.B = function() { 
    C(); 
    } 
} 

sub.prototype = new base(); 

(new sub()).A(); 

如何告訴B()對基類的評估? (即調用基類C)這是不可能的?在javascript中評估基類內部的子類方法

+0

有你不想做一個特別的理由'this.C =函數(){...}'並把它作爲'this.C()'? – ninjagecko

+0

這將允許C調用實例/實質上暴露它。因爲它應該是一個輔助方法,所以沒有理由被暴露。我想你可以說我的主要挫折是輔助方法不能被子類繼承。 –

回答

2

通常我會推薦myFunc.applymyFunc.eval;這就是我在JavaScript中解釋爲「關於基類」的原因。

然而,根據你的標題,你說「內部基類範圍」;如果我假設你正在討論閉包並且能夠引用外部函數中的變量,那麼這是不可能的,除了在閉包中保留一個入口點,你可以在這個閉包中傳遞eval樣式的請求...但是如果你那樣做,你可能會有一個像this._private.C這樣的對象。

如果您試圖保持「私人」的東西,這是不值得在JavaScript中這樣做的麻煩。

如果你說你的動機爲this.C = function(){...}並將其作爲this.C()訪問,我可能會給出更清晰的答案。

這將使C到被稱爲上的實例/實質上暴露了。我們沒有理由爲它被暴露,因爲它應該是一個輔助方法,我想你可以說我的主要無奈的是,幫手方法不能被子類繼承「--OP

在這種情況下,它確實不是私人的。然而,你可以做的是定義你的幫助器方法它所屬的地方:適當地在外部範圍。 =)例如:

(function(){ 

    var C = function() { 
    alert('I am C'); 
    } 

    base = function() { 
    this.A = function() { 
     this.B(); 
    } 
    } 

    sub = function() { 
    this.B = function() { 
     C(); 
    } 
    } 

})(); 

sub.prototype = new base(); 

(new sub()).A(); 
+0

是的,調用和應用是調用原型對象的方法的關鍵 – YODA

+0

@ninjagecko 你,先生,是一個天才(或者我仍然是一個JavaScript新手)。這個外部範圍正是我所期待的。 –

+0

@jiaweihli:沒問題,我還是不建議強調在JavaScript中隱藏內部信息太多。有點相關,雖然你根本不是新手,但你應該意識到最常見的javascript陷阱:如果你用'.map'或'$ .each'或'for'進行任何類型的迭代,循環中,您通常需要編寫匿名函數,因爲每個函數只能創建一個具有單一名稱的變量。如果在循環中定義回調,通常會注意到這一點。 – ninjagecko

1

你不能,至少不能不改變基類。

C具有內base詞法範圍,當用相同的範圍內定義其他方法調用,所以纔可見。這是目前真正的私人方法。

C如果聲明爲this.C而不是var C,則只能在其詞法範圍外訪問。

http://jsfiddle.net/alnitak/DaSEN/

+0

對我來說,似乎有點諷刺意味,我可以在評估A()時訪問C(),因爲我處於基類的範圍內,但是由於它在調用this.B()時向下返回原型鏈,所以我無法更長的訪問時間。 –

+0

@jiaweihli這就是它的工作原理 - 把'C'想象成Java或C++中私有方法的等價物,你也會遇到同樣的問題。 – Alnitak