0

そこで、関数がオブジェクト自体から呼び出されているかどうかを確認するためのハックのようなものを思いつきました。このようなことをしない正当な理由を誰か教えてもらえますか?

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 への呼び出しが機能すると予想されると思います。ただし、caller は無名関数ではうまくいきません。

また、関数を比較しながらインスタンス メソッドと属性全体を反復処理することは、「オブジェクト指向」の方法ではありません。メソッドをエミュレートしようとしているので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 に答える