2012-11-06 67 views
3

有沒有一種很好的方法來定義dojo中的真正的私有變量?dojo的私有變量

在道場1.7/1.8,我發現2種方式來定義私有變量,但他們兩人都是靜態的私人

1.使用匿名即時功能(由類的所有實例共享):

define([ 
'dojo/_base/declare'], function(declare) { 
'use strict';  

return declare('test.Class2', null, (function(){ 
    var a = 1; 
    return { 
     constructor: function(){ 
      console.log('constructor'); 
     }, 
     geta: function(){ 
      return a; 
     }, 
     seta: function(v){ 
      a = v; 
     } 
    }; 
})()); 

});

2.定義模塊定義中的私有變量。

define([ 
'dojo/_base/declare'], function(declare) { 
'use strict';  
var a = 1; 
return declare('test.Class1', null, { 
    constructor: function(){ 
     console.log('constructor'); 
    }, 
    geta: function(){ 
     return a; 
    }, 
    seta: function(v){ 
     a = v; 
    } 
}); 

});

回答

0

如何在構造函數中聲明所需的私有成員?

[...] 
    return declare('test.Class1', null, { 
     constructor: function(){ 
      console.log('constructor'); 
      var = privVar1 = 'foo'; // this is how its normally done in JavaScript 
     }, 

     [..] 

     //so called privileged Method is "public" but can access the "private var" 
     modPrivVar1: function(){ 
      privVar1 = 'bar'; 
     } 
    }); 

我不確定這是否工作正常,因爲我沒有使用dojo定義我的類。請讓我知道它是否有效。

+1

'privVar1'將作用於'構造函數'函數,所以我認爲這不會起作用。 – McDowell

+1

函數「modPrivVar1」中的變量「privVar1」將被視爲全局變量,而不是私有變量。 – qlqllu

3

假設我正確地理解了這個問題,我不認爲有什麼好的方法。

按照Dojo Style Guid,私有變量和方法應當由前述下劃線(例如_myPrivateProperty_myPrivateMethod())標記。然而,這只是慣例,並不能使它們變成私人的;他們仍然可以在課堂外進行訪問。

您可以按照前面所述創建私有靜態變量。另一種方法是在類方法中創建變量,這些變量只能在括號括起來的範圍內可見(正如Paul Kunze在他的回答中所暗示的那樣)。然後你可以在函數參數中將它們傳遞給這個類。但是,我猜這不是你想要的。

對靜態對象和訪問它自己的對象屬性的每個類實例都可以做些聰明的事情。但是,這不會是不尋常的和複雜的。我建議堅持使用underscored-properties來標記你認爲是私有的變量的標準。

1

dojo文檔中有一個例子,它聲明瞭正在返回的主聲明之外的私有類。

define(["dojo/_base/declare"], function(declare){ 
    var _MyPrivateItem = declare(null, { 
    someProperty: null 
    }); 

    return declare(null, { 
    item: null, 

    constructor: function(){ 
     this.item = new _MyPRivateItem(); 
    } 
    }); 
}); 

http://dojotoolkit.org/reference-guide/1.9/dojo/_base/declare.html#dojo-base-declare

private類可能不是最好的解決辦法,但至少它提供了真正的隱私。

0

你可以包含私有變量......但是一切都必須在構造函數中。

[...] 
return declare('test.Class1', null, { 
    constructor: function(){ 
     console.log('constructor'); 
     var privVar1 = 'foo'; // this is how its normally done in JavaScript 

     this.modPrivVar1 = function(){ 
     privVar1 = 'bar'; 
     } 
    }, 
}); 

這樣做的缺點的方法是你需要explicly執行任何繼承限制「聲明」函數的值來使用Dojo加載器。