2017-03-04 99 views
0

我有此功能:更改JavaScript對象

var changeFilter = (function (filterName, filterValue) { 

    var filters = { 
    "tip-oglasa":   "", 
    "zemlja":    "", 
    "grad":     "", 
    "deo-grada":   "", 
    "min-kvadrata":   "", 
    "max-kvadrata":   "", 
    "min-soba":    "", 
    "max-soba":    "", 
    "min-spratova":   "", 
    "max-spratova":   "", 
    "min-godina-izgradnje": "", 
    "max-godina-izgradnje": "" 
    }; 

    return function() { 
    filters[filterName] = filterValue; 
    return filters; 
    }; 

})(); 

我想在哪個對象filters將被定義功能,並獲得/通過兩個功能改變(getFilters,這將只是獲取的過濾器變量和changeFilter這將更改過濾器變量返回結果)。

是否有可能做這樣的事情?我不想讓filters對象公開,因爲我只想通過這兩種方法訪問它。

回答

1

當然,只是返回一個對象字面與功能,這將作爲方法:

var filtersProxy = (function() { 
    var filters = { 
    "tip-oglasa":   "", 
    "zemlja":    "", 
    "grad":     "", 
    "deo-grada":   "", 
    "min-kvadrata":   "", 
    "max-kvadrata":   "", 
    "min-soba":    "", 
    "max-soba":    "", 
    "min-spratova":   "", 
    "max-spratova":   "", 
    "min-godina-izgradnje": "", 
    "max-godina-izgradnje": "" 
    }; 


    return { 
    getFilters: function getFilters() { 
     return filters; 
    }, 

    changeFilter: function changeFilter(filterName, filterValue) { 
     filters[filterName] = filterValue; 
     return filters; 
    } 
    }; 
})(); 

有幾件事情需要注意這個特殊的例子:

  • filtersProxy.getFilters()將返回一個參考filters對象,並且對該對象的更改將通過filters變量反映出來。也就是說,有人可以做filtersProxy.getFilters().foo = 'bar'並改變它。可能的解決方案:
    • 返回對象的副本,以便調用者可以更改您提供的對象而不更改filters
    • 提供訪問者getFilter(key),它返回指定對象屬性處的值。
  • filtersProxy.changeFilter()有相同的問題,它返回filters。在這裏你可以只需return this返回代理對象,並允許鏈接:filtersProxy.changeFilter('foo', 'bar').changeFilter('bar', 'baz').getFilter('baz')
  • 我將參數從IIFE移動到changeFilter方法,因爲這是他們真正屬於的地方。
  • 考慮到您提供get和set訪問器,並且不進行過濾/驗證,與直接使用對象相比,以這種方式執行操作沒有任何優勢,除非您打算在getter和setter中添加一些驗證或其他邏輯。
+0

謝謝!我在我的網頁的腳本中使用它,所以我想讓整個事情變得更加有組織,並且更容易跟蹤/調試,而不需要在全局空間中定義數據(我最後一個項目包含了大量的變量,所以我不想重複同樣的錯誤)。如果我正確地理解了你,你認爲我應該在兩個返回的方法中使另一個與'filters'相同的變量返回而不是'filters'變量,對吧? – Nikola

+0

@Nikola如果你根本沒有防範訪問,你應該直接使用數據對象(比如'filters'),而不是隱藏在沒有任何好處的對象之後。 – cdhowie

+0

@chdowie,好吧,我實際上打算添加更多功能(除了通過AJAX發送此對象的其他功能外),並且更容易完成而不是更改變量,然後調用單獨的函數發送它。 – Nikola

0

當然,例如,你可以有可變「私有」或僅使用var然後有一個getter和setter改變該變量爲你喜歡的功能範圍內訪問:

function Filter() { 
 
    var filters = { 
 
    "tip-oglasa":   "", 
 
    "zemlja":    "", 
 
    "grad":     "", 
 
    "deo-grada":   "", 
 
    "min-kvadrata":   "", 
 
    "max-kvadrata":   "", 
 
    "min-soba":    "", 
 
    "max-soba":    "", 
 
    "min-spratova":   "", 
 
    "max-spratova":   "", 
 
    "min-godina-izgradnje": "", 
 
    "max-godina-izgradnje": "" 
 
    }; 
 
    
 
    this.setFilter = function(filter, value){ 
 
    \t filters[filter] = value; 
 
    } 
 
    
 
    this.getFilter = function(){ 
 
    \t return filters; 
 
    } 
 
} 
 

 
var filter = new Filter(); 
 
console.log(Filter.filters);   // private, shows undefined 
 
console.log(filter.getFilter());  // show filter 
 
filter.setFilter("grad", "foo");  // set grad filter to "foo" 
 
console.log(filter.getFilter());  // shows updated filter