Javascript“priveleged”方法没有为每个对象重新创建?

时间:2013-06-27 14:01:39

标签: javascript oop encapsulation

在寻找从其他语言模拟私有方法时,通常会建议使用Crockford的页面提出这种“priveleged”方法:

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;
    };
}

因此,service可以访问 - 它可以访问私有方法(如dec)和私有变量(如secret)。我认为它也可以称为“公共”方法(分配给Container.prototype的方法)。

但是,service的每个对象都没有为new Container重新创建?是否需要额外的时间并消耗额外的内存?就此而言,私人dec也是如此。

我理解推荐的JS方法是KlassFunction.prototype,以避免出现这种性能问题。但是,可以用这种方式创建非公开方法吗?

1 个答案:

答案 0 :(得分:0)

真的有两种私人。

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

  2. 私有信号通知您与其他开发人员的接口,这些开发人员在运行时没有明显强制执行。你还可以 如果要使用反射,请访问字段。这里private用于防止意外滥用班级内部。

  3. 如果我猜对了,你正试图通过做第一个目标来实现第二个目标。第二个目标可以实现 只需通过约定并在构建步骤中强制执行这些约定。没有必要将其纳入运行时。

    内存使用(实际上放在GC上的压力)不是唯一的问题,封闭类模式非常不灵活,因为你无法重用,共享或继承 任何方式的功能。即使出于临时原因,您也无法访问外部变量。另请阅读http://blog.jcoglan.com/2012/01/19/the-cost-of-privacy/