除非使用我设置的函数,否则是否使对象不可实例化?Javascript
我正在建一个小图书馆来取乐,我想知道我是否遇到了一个设计缺陷,或者是否有一个共同的方法来解决我的问题 假设我有三个对象除非使用我设置的函数,否则是否使对象不可实例化?Javascript,javascript,object,Javascript,Object,我正在建一个小图书馆来取乐,我想知道我是否遇到了一个设计缺陷,或者是否有一个共同的方法来解决我的问题 假设我有三个对象 obj1 = function() { this.create2 = function() { return new obj2(); } } obj2 = function() { this.create3 = function() { return new obj3(); } } obj3 = funct
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
等等
这个问题有一个合适的解决方案吗?您的实现中有一点可能是矛盾的:类的范围(在我看来,您错误地调用了
obj
)
鉴于此片段:
obj1 = function() {
this.create2 = function() {
return new obj2();
}
}
有两种可能性:
- 案例1:将由
生成的对象this.create2()
保留在obj1(private)中new obj2()
- 案例2:您允许从外部(公共)访问它
- 对于案例1:您的类的范围
是错误的,您应该将整个定义放在obj2
中:obj1
obj1 = function() { obj2 = function() { this.create3 = function() { return new obj3(); } } this.create2 = function() { return new obj2(); } }
- 对于案例2:那么类
确实是公共的,您必须保持这种方式obj2
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(从您无权访问的类访问对象是看不见的),但正如我所说的,这只是一种解决方法
我在一些框架中看到,创建者只是将所有内容公开,并在“private”方法前加上“_”,添加了一条注释,如“此方法/对象是私有的,请不要在外部使用”。考虑到javascript是如何设计的,我认为这实际上是公平的。由您自己选择方法。关于您的实现,有一点可能是矛盾的:您的类的范围(在我看来,您错误地调用了
obj
)
鉴于此片段:
obj1 = function() {
this.create2 = function() {
return new obj2();
}
}
有两种可能性:
- 案例1:将由
生成的对象this.create2()
保留在obj1(private)中new obj2()
- 案例2:您允许从外部(公共)访问它
- 对于案例1:您的类的范围
是错误的,您应该将整个定义放在obj2
中:obj1
obj1 = function() { obj2 = function() { this.create3 = function() { return new obj3(); } } this.create2 = function() { return new obj2(); } }
- 对于案例2:那么类
确实是公共的,您必须保持这种方式obj2
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(从您无权访问的类访问对象是看不见的),但正如我所说的,这只是一种解决方法
我在一些框架中看到,创建者只是将所有内容公开,并在“private”方法前加上“_”,添加了一条注释,如“此方法/对象是私有的,请不要在外部使用”。考虑到javascript是如何设计的,我认为这实际上是公平的。由你自己选择。呃,什么<就我所见,code>obj1.create2在这里是
未定义的
。但是,运行obj1()
将起作用。。。用create2
污染全局范围。你知道我的意思var obj1=new obj1();var obj2=obj1.create2()代码>你足够聪明,可以通读所有的文字!或者你不是?呃,什么<就我所见,code>obj1.create2
在这里是未定义的
。但是,运行obj1()
将起作用。。。用create2
污染全局范围。你知道我的意思var obj1=new obj1();var obj2=obj1.create2()代码>你足够聪明,可以通读所有的文字!还是你没有?谢谢这帮了我大忙现在对我来说很有意义,我的课程需要公开,所以我必须找到另一个解决我问题的方法,谢谢你看我的下一篇编辑,我想我有一个解决你问题的方法。谢谢这帮了我大忙现在对我来说很有意义,我的课程需要公开,所以我必须找到另一个解决我问题的方法,谢谢你。请看我的下一篇编辑,我想我有一个解决你问题的方法。