因此,我想出了一些类似黑客的方法来检查和查看是否从对象本身内部调用了函数。有没有人能给我一些好的理由让我不要做这样的事情?
function Poo(){
this.myFunc=function(){
for(x in this)
{
if (this.myFunc.caller==this[x]) {
alert(this.myFunc.caller==this[x]);
return;}
}
alert(false);
}
this.myFunc2=function(){this.myFunc();}
}
var mine=new Poo();
mine.myFunc(); //calling directly not allowed prints false
mine.myFunc2(); //called from a member function allowed prints true发布于 2012-09-05 23:37:42
你可以做任何你想做的事情,但是,我可以向你展示一个你的方法不起作用的例子:
function Poo(){
this.myFunc = function () {
for(x in this) {
if (this.myFunc.caller == this[x]) {
console.info('internal call, accepted');
return;
}
}
console.error('no external calls allowed');
};
this.myFunc3 = function () {
var self = this;
// this is a standard way of
// passing functions to callbacks
// (eg, ajax callbacks)
this.myFunc4(function() {
self.myFunc();
});
}
this.myFunc4 = function (callback) {
// do stuff...
callback();
};
}
var mine = new Poo();
mine.myFunc3();myFunc3在对象中,所以我假设您希望在它提供给myFunc4 (也在对象中)的回调中对myFunc的调用能够工作。然而,caller在处理匿名函数时做得并不好。
此外,在比较函数的同时遍历整个实例方法和属性肯定不是“面向对象”的方式。由于您正在尝试模拟private方法,因此我假设OO就是您要寻找的对象。
您的方法没有利用JS提供的任何功能,您只是以一种不优雅的方式(重新)构建现有的功能。虽然这对于学习目的来说可能很有趣,但我不建议在发布生产代码时使用这种心态。
还有另一个关于堆叠的问题,它有一个您可能感兴趣的答案:Why was the arguments.callee.caller property deprecated in JavaScript?
编辑:在匿名函数this不是实例的情况下,对我从回调中调用myFunc的方式做了一些小的改变。
发布于 2012-09-05 23:23:48
我不能给你一个好的理由不这样做,但更容易的解决方案。
function Poo() {
var myFunc = function() {
alert('myfunc');
};
this.myFunc2 = function() {
myFunc();
}
}
var mine = new Poo();
var mine.myFunc(); // Won't work
var mine.myFunc2(); // Will work发布于 2012-09-05 23:24:24
为什么不使用类似模块模式的东西来隐藏“私有”方法的实现。
var poo = function(){
var my = {},
that = {};
my.poo = function() {
// stuff
};
that.foo = function(){
my.poo(); //works
// more stuff
};
return that;
};
poo.foo(); // works
poo.poo(); // errorhttps://stackoverflow.com/questions/12284614
复制相似问题