我有一个Javascript“class”定义如下:
var Welcomer = function(name) {
var pName = name;
var pMessage = function() {
return "Hi, " + pName + "!";
};
return {
sayHi: function() {
alert(pMessage());
}
};
};
new Welcomer('Sue').sayHi();
有没有办法以这样的方式“子化”Welcomer
,以便我可以重新定义公共方法并访问私有方法和变量?以下内容将允许我访问公共方法,但不允许访问私有方法:
var UnhappyWelcomer = function(name) {
var pSadMessage = function() {
// won't work, b/c I don't have access to pMessage
return pMessage() + " Miserable day, innit?";
};
return {
sayHi: function() {
alert(pSadMessage());
}
};
};
UnhappyWelcomer.prototype = Welcomer(); // failed attempt at inheritance
new UnhappyWelcomer().sayHi();
答案 0 :(得分:9)
您问题的简单答案是否。
你无法做任何事情来获取对那些var
定义的东西的访问权限,除非你的函数在同一范围内,或者你以某种方式“公开”了这些信息(通过返回它或在{上设置它) {1}})。
如果您有权编辑原始函数,则可以通过这样的方式重写事物,即这些函数可以“传递”到扩展函数中,这可以改变对象的“受保护”范围。以下代码应该很好地了解我的建议。
this
答案 1 :(得分:8)
“类”模式不是“类”模式,它被称为Module Pattern。它返回一个与创建它的函数没有关系的对象,除了它的私有变量的可用性。返回的对象不是创建它的函数的实例。
当你调用'new Class()'时,它会创建该函数的一个实例,但它也会返回另一个对象。任何进一步的操作实际上都是返回的对象,而不是实例。
为了使用继承,你真的需要正确使用原型继承,我建议你阅读:
进一步阅读:
很抱歉给您留下阅读材料,但在我看来,您正在探索各种可能性。这些文章将对此事提供更深入的见解。
一旦你对这个问题有了更多的了解,你很可能会完全忽略私人成员并使用_前缀,并像其他人一样使其成为公共成员;)这只是更容易,私人成员无论如何都是毫无意义的。
答案 2 :(得分:1)
如果你真的需要继承,那里有一些图书馆会有很大的帮助。一个选项是trait.js,它实际上可能在某些时候成为javascript的标准部分。如果这不会漂浮你的船,像jQuery和prototype这样的库有继承的帮助。
如果你想采用最小/从零开始的方法,我强烈建议你使用原型模型。与示例中的模式相比,您将看到性能大幅提升。
要更直接地解决您的问题,不。如果您设计“课程”,那么您将有一个更轻松的时间,因此不依赖私人职能。