我基本上试图在函数本身中设置函数的原型。目的是在一个公共函数中隐藏许多函数,同时保留其功能。
以下是jsFiddle中的非工作代码。预期的行为是显示“问候!”并“把我带到你的领导。”
通过将Outer.prototype
行和Extensions
函数移出Outer
函数到全局范围,可以“修复”代码。但是,这意味着Extensions
函数是公共的,可以直接使用,但不应该这样。
实现这种“私人”行为的好方法是什么?
答案 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。