2013-11-10 51 views
1

所以我有一個標準的揭示模塊模式,而不是公開所有我的配置設置,我只是想公開這些配置的較小的子集。如果有解決方法或者我缺少某些東西,它就不起作用和好奇。在揭示模塊模式中,你能公開一個散列屬性嗎?

var rmp = function(){ 
     var config = { 
      someValue = "I like p&j sandwiches", 
      anotherVal = { 
       a: 'somevalue' 
      } 
     } 

     var func1 = function(){ 
      // do some stuff 

     } 

     return { 
      func1: func1, 
      config.someValue: someValue // <-- doesn't work 
      config[someValue] : someValue // <-- doesn't work 
      config : config // <-- works 
     } 

    } 

似乎不允許單獨使用散列的屬性。 現在,當然,如果我創建一個只返回該值的func,那麼它就可以工作。但我不想爲此創建另一個功能。

 var showme = function(){ 
     return config.someValue; 
     } 


     return { 
      func1: func1, 
      showme: showme 
     } 
+3

這不是有效的語法。你需要在返回的對象中創建適當的結構 – elclanrs

回答

2

什麼是這樣的:

return { 
     func1: func1, 
     someValue: config.someValue 
} 

現在您的config物品不會向公衆披露,但someValue物業除外。

說明

這是你們的問題。首先你的代碼中有語法錯誤。在config.someValue: someValueconfig[someValue] : someValue之後您錯過了comma

其次,例如在config.someValue: someValue中,您指的是someValue - 在右側 - 它未在腳本中定義。單獨使用正確的方法是config.someValue而不是someValue

第三件事是我認爲你對javascript對象和揭示模塊設計模式是如何工作有點誤解。當您編寫return部件時,您不需要使用屬性名稱將其公開。例如,你可以寫whateverFunc: func1,它會工作得很好。你想要做的是使用例如config.someValueconfig[someValue],它可以工作,但是沒有任何關係/訪問您的實際config對象。

爲了更清楚設想以下return對象:

return { 
    doSomething: func1, 
    doAnotherThing: function() { 
     return config.someValue; 
    }, 
    getSomeValue: config.anotherVal 
} 

所以,你可以看到該對象的屬性 - 左側 - 只是一個名稱,以表明已分配給他們的價值 - 右側。

1

您不能使某個對象的某些屬性爲private而爲某些public屬性。然而,你可以做的是定義一個新的對象,公開你想要公開的屬性並返回它。爲了達到最佳效果,市民對象的屬性將在下面的例子中改變實際的配置對象,如:

var rmp = function(){ 
    var config = { 
    someValue : "I like p&j sandwiches", 
    anotherVal : { 
     a: 'somevalue' 
    } 
    }; 

    var publicConfig = Object.create(null, { 
    someValue : { 
     set : function(val) { config.someValue = val; }, 
     get : function() { return config.someValue; } 
    } 
    }); 

    var func1 = function(){ 
    console.log(config.someValue); 
    }; 

    return { 
    func1: func1, 
    config: publicConfig 
    }; 
}; 


var r = new rmp(); 
r.func1(); // I like p&j sandwiches 
r.config.someValue = 'Changed'; 
r.func1(); // Changed 

DEMO:http://jsbin.com/iJEZaBu/1/edit

+0

嗯,實際上你可以使一個對象的某些屬性是私有的而其他的屬性是公有的,但是你不能將一個已經是公共對象的屬性改爲私有屬性。 – Mahdi

0

你不能像這樣設置配置的子屬性。這應該爲你工作

var rmp = function(){ 
    var config = { 
     someValue = "I like p&j sandwiches", 
     anotherVal = { 
      a: 'somevalue' 
     } 
    } 

    var func1 = function(){ 
     // do some stuff 

    } 

    return { 
     func1: func1, 
     config: { someValue: config.someValue}, 
    } 

}

這樣,你得到有效的複製你關閉的配置的選擇屬性在返回的對象不同的配置。