2012-03-07 165 views
0

我正在努力使JS對象和訪問私有方法。嘗試返回函數時遇到的問題是私有方法無法訪問。代碼如下。訪問JS私有方法

var Item = (function() { 

    var price = 0; 
    var name = ''; 
    var description = ''; 
    var quantity = ''; 
    var attributes = {}; 

    var Item = function(data) { 

    } 

    function setPrice(variable) { 
     this.price = variable; 
    }; 

    function getPrice() { 
     return this.price; 
    }; 

    function setName(variable) { 
     this.name = variable; 
    }; 

    function getName() { 
     return this.name; 
    }; 

    function setDescription(variable) { 
     this.description = variable; 
    }; 

    function setQuantity(variable) { 
     this.quanity = variable; 
    }; 

    return function(data){ 

     setPrice : setPrice; 
     getPrice : getPrice; 
     setName : setName; 
     setDescription : setDescription; 
     setQuantity : setQuantity; 

     return new Item(data); 
    } 

})(); 

item2 = Item(); 
    item2.setPrice('3'); 
alert(item2.getPrice()); 

使用此設置,我如何訪問私有方法?

+4

爲什麼要加入ss私有方法?他們是私人的原因。 – 2012-03-07 03:12:24

+0

我正在遵循一個名爲Revealing模塊的設計模式。 http://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript – 2012-03-07 03:13:42

+0

該設置沒有多大意義。你從自執行函數返回的函數有一堆標籤,然後評估函數。此外,將'this.'添加到它(在將':'更改爲'='之後)將不會執行任何有用的操作,因爲您在最後返回一個「Item」。 – icktoofay 2012-03-07 03:15:05

回答

2

我不認爲這種模式適用於你想要做的事情。我認爲使用這樣的模式可以讓你的代碼更小,更可重用。這樣你也可以擺脫set的功能。

var Item = function(options) { 

    var opts = $.extend({ 
     price: 0, 
     name: '', 
     description: '', 
     quantity: '', 
     attributes: {} 
    }, options); 

    // ... 
    this.getPrice = function() { 
     return opts.price; 
    }; 

    // ... 
}; 

var item = new Item({ 
    price: 100, 
    name: 'onehundred', 
    // ... 
}); 

alert(item.getPrice()); 
+0

這工作夠好。我想知道它的缺點是什麼。 – 2012-03-07 04:06:55

1

修正你的代碼在這裏:http://jsfiddle.net/pratik136/JryAk/

變更項目:

  • 檢查return聲明
  • Item是一個變種,你試圖實例化一個類的對象item2
+0

這不起作用,我需要做出多個不同的項目。這是什麼原因實例化。 – 2012-03-07 03:40:29