Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript";私密的;不为每个对象重新创建的方法?_Javascript_Oop_Encapsulation - Fatal编程技术网

Javascript";私密的;不为每个对象重新创建的方法?

Javascript";私密的;不为每个对象重新创建的方法?,javascript,oop,encapsulation,Javascript,Oop,Encapsulation,当四处寻找其他语言的私有方法时,通常建议Crockford的页面提出这种“私有化”方法: 所以服务是私有的-它可以访问私有方法(如dec)和私有变量(如secret)。我假设它也可以调用“public”方法(那些分配给Container.prototype)的方法 但是,不是为新容器的每个对象重新创建了服务吗?它不需要额外的时间和消耗额外的内存吗?就这一点而言,还有私人dec 我知道,推荐的JS方法是在KlassFunction.prototype上创建方法,以避免这种性能问题。但是,非公共方法

当四处寻找其他语言的私有方法时,通常建议Crockford的页面提出这种“私有化”方法:

所以
服务
是私有的-它可以访问私有方法(如
dec
)和私有变量(如
secret
)。我假设它也可以调用“public”方法(那些分配给
Container.prototype
)的方法

但是,不是为新容器的每个对象重新创建了服务吗?它不需要额外的时间和消耗额外的内存吗?就这一点而言,还有私人
dec


我知道,推荐的JS方法是在
KlassFunction.prototype
上创建方法,以避免这种性能问题。但是,非公共方法可以用这种方式创建吗?

实际上有两种私有方法

  • 在运行时严格执行的那种私有类型。当然,这总是有运行时惩罚。这里,
    private
    用作安全机制。在Javascript中完全无用

  • 私有接口可以向其他开发人员发出在运行时没有明显强制执行的接口信号。你仍然可以 如果要使用反射,请访问字段。这里的
    private
    用于防止类内部的意外误用

  • 如果我猜对了,你是想通过第一个目标来实现第二个目标。第二个目标是可以实现的 只需通过约定并在构建步骤中强制实施这些约定。无需将其带入运行时

    内存使用(实际上对GC施加的压力)不是唯一的问题,闭包类模式非常不灵活,因为您无法重用、共享或继承
    任何方式的功能。即使是暂时的原因,您也无法访问外部变量。也请阅读

    你完全正确。在
    原型上设置它将允许所有实例引用一个函数,而不是每次实例化都重新创建它。但正如您所注意到的,该方法将无法引用构造函数中的任何“私有”变量。这通常是一种折衷。没有理由期望每次调用构造函数时都会重新创建私有函数的代码。运行时(可能)会创建一个新的函数实例,但现代实现将能够共享代码。我不认为内存使用应该是一个很大的问题,除非你们正在创建数以百万计的对象。
    
    function Container(param) {
    
        function dec() {
            if (secret > 0) {
                secret -= 1;
                return true;
            } else {
                return false;
            }
        }
    
        this.member = param;
        var secret = 3;
        var that = this;
    
        this.service = function () {
            return dec() ? that.member : null;
        };
    }