我本质上是在尝试在函数本身内设置函数的原型。目的是将许多功能隐藏在一个公共功能中,但保留功能。
这是jsFiddle中的非工作代码。预期的行为是显示“问候!” 和“带我去见你的领导。”
Outer.prototype
可以通过将行和Extensions
函数移出Outer
函数到全局范围来“修复”代码。但是,这意味着该Extensions
功能是公开的并且可以免费直接使用,这是不应该的。
实现这种“私人”行为的好方法是什么?
我本质上是在尝试在函数本身内设置函数的原型。目的是将许多功能隐藏在一个公共功能中,但保留功能。
这是jsFiddle中的非工作代码。预期的行为是显示“问候!” 和“带我去见你的领导。”
Outer.prototype
可以通过将行和Extensions
函数移出Outer
函数到全局范围来“修复”代码。但是,这意味着该Extensions
功能是公开的并且可以免费直接使用,这是不应该的。
实现这种“私人”行为的好方法是什么?
这不起作用,因为您正在覆盖原型。当你调用时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 中正确完成的继承的非常好的解释,请参阅此答案。