将函数的原型设置为私有变量

时间:2012-06-25 22:33:00

标签: javascript scope prototype

我基本上试图在函数本身中设置函数的原型。目的是在一个公共函数中隐藏许多函数,同时保留其功能。

以下是jsFiddle中的非工作代码。预期的行为是显示“问候!”并“把我带到你的领导。”

通过将Outer.prototype行和Extensions函数移出Outer函数到全局范围,可以“修复”代码。但是,这意味着Extensions函数是公共的,可以直接使用,但不应该这样。

实现这种“私人”行为的好方法是什么?

1 个答案:

答案 0 :(得分:1)

这不起作用,因为您覆盖原型。当您致电new Outer时,this将继承当前 Outer.prototype。然后,您将在函数内部覆盖Object.prototype,但它不会影响当前创建的实例,只影响将来的实例。
您必须扩展现有的原型。

但如果你想隐藏某些功能,请使用自我调用功能

var Outer = (function() {

    function Extensions() {
    }
    Extensions.protoype.Greet = function () {
        alert(this.Greetings);
    }

    function Inner() {
        Extensions.call(this);
        this.Greetings = "Take me to your leader.";
    }
    Inner.prototype = Object.create(Extensions.prototype);
    Inner.prototype.constructor = Inner;

    function Outer() {
        Extensions.call(this);
        this.Greetings = "Greetings!";
    }
    Outer.prototype = Object.create(Extensions.prototype);
    Outer.prototype.constructor = Outer;

    Outer.prototype.getInner = function() {
        return new Inner();
    };

    return Outer;

}());

这里,Extensions在立即执行的函数内定义。因此无法从外部访问。从您从该函数返回后,只能访问Outer

有关在JavaScript中完成的继承的非常好的解释,请参阅this answer