【问题标题】:JavaScript Class Best Practice?JavaScript 类最佳实践?
【发布时间】:2013-11-12 13:54:38
【问题描述】:

我目前正在研究在 JavaScript 中构建类的不同模式。但无论我看到什么样的模式,仍然有些事情我不太确定。

var ItemManager = (function()
{
    var p = function()
    {
        this.items= [];
    };

    p.prototype.addItem = function(item)
    {
        var self = this;    
        self.items.push(item);
    };

    return p;
}());

我创建了一个简单的类ItemManager,这个类得到了函数addItem 用于将任何项目添加到集合中。现在我真的不希望代表集合的变量 items 是公共的,这个变量应该是私有的,但是我看不到任何可能的方式来使用原型方法来访问私有变量。

那么在这种情况下,最佳做法是什么?根本不使用私有变量?

【问题讨论】:

标签: javascript class oop


【解决方案1】:
var ItemManager = function() {
    var items = [];

    return {
           addItem : function(item) {   
               items.push(item);
           },
           removeItem : function() {
                return items.pop();
           }
     }
};

var myItemManager = new ItemManager();

items 变量在ItemManager 函数执行后被隐藏,但addItemremoveItem 仍然共享对items 的访问权限。请参阅 Douglas Crockford's article 关于 JavaScript 中的私有变量以进行进一步调查。

【讨论】:

  • 除了上面的注释:这将为每个分离的对象创建一组新的匿名函数(分配给addItemremoveItem 属性)。
  • @Passerby 是的,我明白了……我会试着找出原因。感谢您的评论。
  • @aga:这很简单——因为在每次构造函数调用时,您都会返回一个新对象
  • @zerkms 看看下面这段代码:var a = []; a instanceOf Array; 这里我创建了一个新对象,但它仍然是Array 的实例。为什么会起作用?
  • @aga:因为您正在创建Array 类型对象的实例。详情请查看stackoverflow.com/a/1978474/251311
【解决方案2】:

several ways有私有变量:

我喜欢符号,尽管它们仍然可以使用反射找到(即不是完全私有的)。示例:

var Person = (function() {
    var nameSymbol = Symbol('name');
​
    function Person(name) {
        this[nameSymbol] = name;
    }
​
    Person.prototype.getName = function() {
        return this[nameSymbol];
    };
​
    return Person;
}());

因此,可以(合理地)拥有私有变量,但不幸的是,没有一个解决方案能像您想要的那样优雅。

【讨论】:

    【解决方案3】:

    正如 GoldenerAal 提到的,它们不称为类,而是函数 你有

    var ItemManager = function (){
    ..
    ...
    ...
    
    };
    

    你可以:

    function ItemManager(){
    this.items = [];
    
    function addItem(item){
    ...
    };
    };
    

    然后您可以创建 ItemManager 的实例,仅当您需要时:

    var itemManager = new ItemManager();
    itemManager.addItem(<something here>);
    

    http://javascript.crockford.com/private.html 函数内的变量仅具有该函数的范围,该变量不是全局变量(静态变量)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多