2012-06-25 21 views
0

我基本上試圖在函數本身內設置函數的原型。目的是在一個公共功能中隱藏很多功能,但保持功能。將函數的原型設置爲私有變量

以下是jsFiddle中的非工作代碼。預期的行爲是顯示「問候!」和「帶我去你的領導。」

通過將Outer.prototype行和Extensions函數從Outer函數移出到全局範圍,可以「固定」該代碼。但是,這意味着Extensions函數是公開的,可以直接使用,不應該這樣做。

什麼是實現這種「私人」行爲的好方法?

回答

1

這不起作用,因爲你是覆蓋的原型。當您撥打new Outer時,this將繼承目前的Outer.prototype。然後,您在函數內重寫Object.prototype,但它不會影響當前創建的實例,只會影響未來的實例。
你必須擴展現有的原型。

但是如果你想隱藏某些功能,使用自調用函數

var Outer = (function() { 

    function Extensions() { 
    } 
    Extensions.protoype.Greet = function() { 
     alert(this.Greetings); 
    } 

    function Inner() { 
     Extensions.call(this); 
     this.Greetings = "Take me to your leader."; 
    } 
    Inner.prototype = Object.create(Extensions.prototype); 
    Inner.prototype.constructor = Inner; 

    function Outer() { 
     Extensions.call(this); 
     this.Greetings = "Greetings!"; 
    } 
    Outer.prototype = Object.create(Extensions.prototype); 
    Outer.prototype.constructor = Outer; 

    Outer.prototype.getInner = function() { 
     return new Inner(); 
    }; 

    return Outer; 

}()); 

這裏,Extensions是立即執行函數中定義。因此它不能從外部訪問。自從您從該函數返回後,只能訪問Outer

請參閱this answer瞭解JavaScript中正確執行的繼承。

+0

很酷。 「Inner」功能呢? 'Extensions.Greet'函數也必須能夠在'Inner'對象上調用。 –

+0

你可以用完全相同的方法來完成。在閉包中定義它並從'getInner'方法返回一個新實例。 –

+0

你可以添加到代碼,所以我可以看到它?在我的腦海中看到它有點難。特別是因爲我仍然在努力嘲諷像'call'這樣的花哨的東西。 –