1

我正在构建一个有趣的小库,并且想知道我是否遇到了设计缺陷,或者是否有解决我问题的通用方法。

假设我有三个对象

obj1 = function() {

    this.create2 = function() {
        return new obj2();
    }
}

obj2 = function() {

    this.create3 = function() {
        return new obj3();
    }
}

obj3 = function() {

    this.create4 = ......
} 

我想阻止人们能够obj2独立实例化(var obj2 = new obj2())并强迫他们使用obj1.create2相同的obj2.create3等等?

这个问题有合适的解决方案吗?

4

1 回答 1

4

关于你的实现,有一件事可能是矛盾的:你的类的范围(顺便说一句,我老实说你叫错了obj)。

鉴于此片段:

obj1 = function() {

    this.create2 = function() {
        return new obj2();
    }
}

有2种可能:

  • 案例 1:您将new obj2()生成的对象保留this.create2()在 obj1 (私有)中
  • 案例 2:您允许从外部(公共)访问它

对应解决方案:

  • 对于案例 1:你的类的范围obj2是错误的,你应该把整个定义放在obj1

    obj1 = function() {
        obj2 = function() {
            this.create3 = function() {
                return new obj3();
            }
        }
        this.create2 = function() {
            return new obj2();
        }
    }
    
  • 对于案例 2:那么该课程obj2确实是公开的,您必须保持这种状态。

可能的解决方法

您可以做的是将对象保留为公共状态(即对其直接外部范围公开),但仍然将所有内容封装在一个全局对象(api 映射器)中,该对象本身只会公开其某些方法。

例如:

function api() {

    obj1 = function() {

        this.create2 = function() {
            return new obj2();
        }
    }

    obj2 = function() {

        this.create3 = function() {
            return new obj3();
        }
    }

    obj3 = function() {

        this.create4 = ......
    }

    this.object1 = new obj1;
    this.object2 = new obj2;
    this.object3 = new obj3;

}

现在,从其他任何地方:

var o1 = api.object1.create2(); //OK: will instanciate a new obj2
var o2 = new obj2; //NOT OK: there's no access to obj2 from here

这根本不是 OOP(从您无权访问的类中访问对象是相当看不见的),但正如我所说,这只是一种解决方法。

我在某些框架中看到创建者只是将所有内容都公开,并在“私有”方法前加上“_”,添加诸如“此方法/对象是私有的,请不要在外部使用”之类的注释。我认为这实际上是公平的,想想 javascript 是如何设计的。由你来选择你的方式。

于 2013-06-09T21:10:48.887 回答