0

所以我想出了一些 hackish 的方法来检查是否从对象本身调用了一个函数。有人可以给我一些很好的理由不做这样的事情吗?

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
4

3 回答 3

1

您可以做任何您想做的事情,但是,我可以向您展示您的方法不起作用的情况:

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 的调用起作用。但是,调用者在匿名函数方面表现不佳。

此外,在比较函数时遍历整个实例方法和属性绝对不是“面向对象”的方式。由于您正在尝试模拟private方法,因此我假设您正在寻找 OO。

您的方法没有利用 JS 提供的任何功能,您只是以一种不优雅的方式(重新)构建现有功能。尽管出于学习目的它可能很有趣,但我不建议使用这种思维方式来交付生产代码。

关于 stackover 的另一个问题有一个您可能感兴趣的答案: 为什么在 JavaScript 中不推荐使用 arguments.callee.caller 属性?

编辑:我如何从回调中调用 myFunc 的小改动,在匿名函数this中不是实例。

于 2012-09-05T15:37:42.057 回答
0

我不能给你一个很好的理由不这样做,但更简单的解决方案。

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-05T15:23:47.580 回答
0

为什么不使用模块模式之类的东西来隐藏“私有”方法的实现。

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(); // error
于 2012-09-05T15:24:23.940 回答