2012-07-04 73 views
5

有人可以解釋從Single Page Apps in Depth這段摘錄的含義嗎?使用.call/.apply隱藏類方法

爲類A共用圖案(例如,從一個 原型實例化的對象)是簡單地通過啓動他們 用下劃線標記類的方法爲私人。 您可以使用 .call/.apply來設置「this」,但我不會在此處顯示;這是一個小細節 的細節。

我認爲這表明有一種方法實際上使「私人」的JavaScript方法實際上無法進入的,而不是隻用下劃線標記他們的約定,但我無法想象的實現將是什麼樣子,也不它將如何使用。

+0

+1鏈接到單頁應用電子書!謝謝.. – renatoargh

回答

3
var Treasure = function(){ 
    function locate(){ 
    return this.x * this.y + 31337; 
    } 

    function Treasure(x, y){ 
    this.x = x; 
    this.y = y; 
    } 

    Treasure.prototype.find = function find(){ 
    return locate.call(this); 
    }; 

    return Treasure; 
}(); 

locate是構造函數和原型方法的共享私有函數。使用call它可以像一個方法,並利用this

這個概念的更完整的實現是接口對象和實現對象。而不是有一些隨機的函數作爲方法(類似於上面的定位),你實際上創建了一個私有的整個類。每個接口的外部創建都會生成兩個對象:公共shell接口和專用實現對象。這允許您公開一個接口,該接口公開提供了另一種可能更易於使用的API。或者可以允許您爲整個接口對象組重用單個私有實現對象。

這實際上是如何指定DOM的工作(通常不是在js中實現)。接口對象(例如元素和節點對象)特別需要包裝實際執行該單詞的底層實現。暴露的對象只是轉發屬性訪問和方法調用的外殼。

Dom.js是在js中完成的DOM實現。我在工作時熟悉的一個有趣的技術是完全自動生成公共接口。這是IDL的目的:公開API是自動生成的,只留下實際創建的私有實現。這真的意味着它可以在沒有諮詢人類的情況下創建這樣的東西:https://github.com/Benvie/svgstuff/blob/master/lib/defs.js

1

在本例中可以看到兩種類型的變量。你會注意到,第一個是私有的,第二個是公共訪問:

function x() { 
    var _var1 = "hello"; 
    this.var2 = "world"; 
    x.prototype.innerTest = function() { 
     console.log("inner var1: " + _var1); 
     console.log("inner var2: " + this.var2); 
    } 
} 

var y = new x; 
console.log("var1: " + y._var1); 
console.log("var2: " + y.var2); 

// var1: undefined 
// var2: world 

運行內部測試表明,VAR1可以從類中訪問:

y.innerTest(); 
// var1: hello 
// var2: world