除非使用我设置的函数,否则是否使对象不可实例化?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()
    生成的对象
    new obj2()
    保留在obj1(private)中
  • 案例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(从您无权访问的类访问对象是看不见的),但正如我所说的,这只是一种解决方法


我在一些框架中看到,创建者只是将所有内容公开,并在“private”方法前加上“_”,添加了一条注释,如“此方法/对象是私有的,请不要在外部使用”。考虑到javascript是如何设计的,我认为这实际上是公平的。由您自己选择方法。

关于您的实现,有一点可能是矛盾的:您的类的范围(在我看来,您错误地调用了
obj

鉴于此片段:

obj1 = function() {

    this.create2 = function() {
        return new obj2();
    }
}
有两种可能性:

  • 案例1:将由
    this.create2()
    生成的对象
    new obj2()
    保留在obj1(private)中
  • 案例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(从您无权访问的类访问对象是看不见的),但正如我所说的,这只是一种解决方法


我在一些框架中看到,创建者只是将所有内容公开,并在“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()你足够聪明,可以通读所有的文字!还是你没有?谢谢这帮了我大忙现在对我来说很有意义,我的课程需要公开,所以我必须找到另一个解决我问题的方法,谢谢你看我的下一篇编辑,我想我有一个解决你问题的方法。谢谢这帮了我大忙现在对我来说很有意义,我的课程需要公开,所以我必须找到另一个解决我问题的方法,谢谢你。请看我的下一篇编辑,我想我有一个解决你问题的方法。