从 javascript 类中的“私有”方法访问“公共”方法
Posted
技术标签:
【中文标题】从 javascript 类中的“私有”方法访问“公共”方法【英文标题】:Accessing "Public" methods from "Private" methods in javascript class 【发布时间】:2011-02-11 19:31:16 【问题描述】:有没有办法从类中的“私有”函数调用“公共”javascript 函数?
查看以下课程:
function Class()
this.publicMethod = function()
alert("hello");
privateMethod = function()
publicMethod();
this.test = function()
privateMethod();
这是我运行的代码:
var class = new Class();
class.test();
Firebug 给出这个错误:
publicMethod 未定义:[Break on this error] publicMethod();
是否有其他方法可以在 privateMethod() 中调用 publicMethod() 而无需访问全局类变量 [即class.publicMethod()]?
【问题讨论】:
我希望这只是您的示例中的一个错字,但您的privateMethod
是一个全局变量。
在 Firefox 中,如果我调用 class.privateMethod()
会出现错误,而 class.publicMethod()
工作正常,因此这两个函数之间似乎存在一些差异。
【参考方案1】:
您可以在构造函数的范围内保存一个变量来保存对this
的引用。
请注意:在您的示例中,您在 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();
【讨论】:
【参考方案2】:接受的答案可能具有不良副作用,即在每个实例中将创建 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 原型,而不必用自己的私有和公共函数版本污染每个实例。
【讨论】:
不错!你也可以privateMethod.call(this)
而不是传入【参考方案3】:
torazaburo 的答案是最好的答案,因为它避免了创建私人成员的多个副本。我很惊讶克罗克福德根本没有提到它。或者,根据您喜欢声明公共成员函数的语法,您可以这样做:
function Class()
(function()
var privateMethod = function(self)
self.publicMethod();
;
Class.prototype.publicMethod = function()
alert('hello');
;
Class.prototype.test = function()
privateMethod(this);
;
());
【讨论】:
【参考方案4】:这种方法不是可取的吗?不过我不确定
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();
【讨论】:
以上是关于从 javascript 类中的“私有”方法访问“公共”方法的主要内容,如果未能解决你的问题,请参考以下文章