2012-06-22 55 views
5

在製作javascript類功能時,我使用this.很多。但是在使用它的時候,它讓我想知道是否使用var代替了它。什麼時候應該使用this.x vs var x?

var myClass = function() { 
    this.x = 4; 
    return { 
     getVal: this.x 
    }; 
} 

與配合使用VAR

var myClass = function() { 
    var x = 4; 
    return { 
     getVal: x 
    }; 
} 

的同樣的事情請告訴我的差異,當我要使用它們?

回答

7

變量與this變成public變量,而那些與var變成private變量。

this關鍵字成爲實例成員,這意味着它們將在類的每一個新創建的實例是可用之類的聲明的變量或函數。當您使用this時,您創建了一個類,並且需要使用new關鍵字實例化它,如下所示。

實施例:

function Foo() { 
    // private var 
    var bar = 'I am bar'; 
    // public var 
    this.baz = 'I am baz'; 
} 

var f = new Foo; 
console.log(f.bar); // undefined 
console.log(f.baz); // I am baz 

同時使一個JavaScript類函數,我使用此。很多。但 使用時,它使我不知道是否會使 區別使用var來代替。

有顯着差異,您不應該創建變量與this關鍵字,你不希望出現在類的實例,除非另有需要。這只是產生一個開銷,並且正如Crockford所說的那樣是計算廢物

+0

如果爲了論證的緣故,我會添加一個return {},就像我在我的例子中所做的那樣。現在不會成爲這個函數的公共範圍,而不是所有這些變量? – Kristian

+0

@Kristian:是的,無論你想返回使用'return'關鍵字仍然可用於外部代碼。這取決於你想要返回哪些私有變量或函數。公共變量是公共的,所以它們不一定要放在'return'塊中。事實上,您可以搜索使用相同方法的JavaScript展示模式。順便說一句,你的代碼不會工作,除非你在'var myClass = function(){/ * code * /}();'末尾添加'()''' – Blaster

+0

我正在實例化它。但雅,我幾乎總是使用揭示模式,這似乎接管了this.something的正常可見性......這就是爲什麼我從來沒有想過在 – Kristian

1

您可以通過myClass.x訪問this.x,但您無法在var x的情況下執行此操作。這是關於封裝。

+0

是不是我簡單地通過使用返回對象封裝? – Kristian

1

如果你不需要繼承,閉包(var case)和對象(本例)基本上做同樣的事情,並且是roughly interchangeable

差異要牢記:

  • 當你使用「本」的構造需要用「新」被稱爲和方法需要與.CALL叫,如果你把它們存儲在一個變量或通過它們作爲回調。

  • 如果實例化大量的對象可能有性能差異(當前引擎可能有更好的對象 - 但只有當你把方法的原型,而不是設置它們的構造函數)

  • 變量聲明爲「var」是私有的,不能在函數之外訪問。有時候,這是確定的,但這個可以做繼承阻止你(不存在「在Javascript中保護」的概念)

1

this:x像實例變量。這些變量具有公共範圍。在OOP中用作類變量。

雖然var x;範圍有限。這些變量的行爲與私有變量類似,可在本地範圍內訪問。

相關問題