关于你的实现,有一件事可能是矛盾的:你的类的范围(顺便说一句,我老实说你叫错了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 是如何设计的。由你来选择你的方式。