访问;“公众”;方法来自;“私人”;javascript类中的方法
有没有办法从类中的“私有”函数调用“公共”javascript函数 查看下面的课程:访问;“公众”;方法来自;“私人”;javascript类中的方法,javascript,oop,private,public,Javascript,Oop,Private,Public,有没有办法从类中的“私有”函数调用“公共”javascript函数 查看下面的课程: function Class() { this.publicMethod = function() { alert("hello"); } privateMethod = function() { publicMethod(); } this.test = function() { private
function Class()
{
this.publicMethod = function()
{
alert("hello");
}
privateMethod = function()
{
publicMethod();
}
this.test = function()
{
privateMethod();
}
}
以下是我运行的代码:
var class = new Class();
class.test();
Firebug出现以下错误:
未定义publicMethod:[在此错误上中断]publicMethod()强>
是否有其他方法在privateMethod()中调用publicMethod(),而不访问全局类变量[即class.publicMethod()]?您可以在构造函数的作用域中保存一个变量,以保存对该
的引用
请注意:在您的示例中,您在privateMethod=function()之前遗漏了var
,
将privateMethod
设置为全局。我已在此处更新了解决方案:
function Class()
{
// store this for later.
var self = this;
this.publicMethod = function()
{
alert("hello");
}
var privateMethod = function()
{
// call the method on the version we saved in the constructor
self.publicMethod();
}
this.test = function()
{
privateMethod();
}
}
接受的答案可能会产生不良的副作用,即在每个实例中分别创建publicMethod
、test
和privateMethod
的副本。避免这种情况的习惯用法是:
function Class()
{}
Class.prototype=(function()
{
var privateMethod = function(self)
{
self.publicMethod();
}
return
{
publicMethod: function()
{
alert("hello");
},
test: function()
{
privateMethod(this);
}
};
}());
换句话说,您需要将this
作为参数传递给私有函数。作为回报,您可以得到一个true原型,而不必用私有和公共函数的各自版本污染每个实例。torazaburo的答案是最好的,因为它避免了创建私有成员的多个副本。我很惊讶Crockford一点也没提到。或者,根据声明公共成员函数的语法,可以执行以下操作:
function Class()
{}
(function() {
var privateMethod = function(self) {
self.publicMethod();
};
Class.prototype.publicMethod = function() {
alert('hello');
};
Class.prototype.test = function() {
privateMethod(this);
};
}());
这种方法不可取吗?不过我不确定
var klass = function(){
var privateMethod = function(){
this.publicMethod1();
}.bind(this);
this.publicMethod1 = function(){
console.log("public method called through private method");
}
this.publicMethod2 = function(){
privateMethod();
}
}
var klassObj = new klass();
klassObj.publicMethod2();
我希望这只是您的示例中的一个输入错误,但是您的privateMethod
是一个全局变量。在Firefox中,如果我调用class.privateMethod()
会出现一个错误,而class.publicMethod()
工作正常,因此这两个函数之间似乎存在一些差异。很好!您也可以调用(this)
,而不是传入