0

我本质上是在尝试在函数本身内设置函数的原型。目的是将许多功能隐藏在一个公共功能中,但保留功能。

这是jsFiddle中的非工作代码。预期的行为是显示“问候!” 和“带我去见你的领导。”

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

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

4

1 回答 1

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 中正确完成的继承的非常好的解释,请参阅此答案

于 2012-06-25T22:41:09.133 回答