2012-03-07 108 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