javascript 函数取得调用对象的信息。

function testObject(){
            this.commonFun=function() {
                console.log(arguments.callee.caller);
            }
        }

        (function () {

            function test1() {
                this.test = "test1";
                this.testFun = function () {
                    (new testObject()).commonFun();
                }
            }

            var test1 = new test1();
            test1.testFun();

        }());


        (function () {
            function test2() {
                this.test = "test2";
                this.testFun = function () {
                    (new testObject()).commonFun();
                }
            }

            var test2 = new test2();
            test2.testFun();
        }());

上面的console.log() 打印的调用函数,但我现在想要的是调用对象的信息,如,test1对象调用的返回的是test1的test属性,就是输出 test1,
test2对象调用的返回的是test2的test属性,就是输出 test2

函数commonFun作用是输出调用对象的的某些属性,就像上面的test属性,不能传入参数

阅读 3.8k
2 个回答
function testObject(){                                                              
  console.log('is testObject');                                                     
  this.commonFun=function() {                                                       
    console.log(arguments.callee.caller);                                           
  }                                                                                 
}

commonFun的caller就一直是testObject,你这种调用方法,做不到通过caller来显示更上一层的调用关系。

可以改写成:

function testObject(){                                                              
  console.log('is testObject');                                                     
  this.commonFun=function(arg1) {                                                       
    console.log(arguments.callee.caller);
    console.log(arg1);
  }                                                                                 
}

(function () {                                                                      
                                                                                    
  function test1() {                                                                
    this.test = "test1";                                                                                                                                    
    this.testFun = function () {                                                    
      (new testObject()).commonFun(this.test);                                               
    }                                                                               
  }                                                                                 
                                                                                    
  var test1 = new test1();                                                          
  test1.testFun();                                                                  
                                                                                    
}())

首先,你的设计上就有问题,你callee,caller这些取到的都是函数,不是实例,看下面的例子:


function testObject(){
            this.commonFun=function() {
                console.dir(arguments.callee.caller.caller.qq);
            }
        }

(function () {

    function test1() {
        this.test = "test1";
        this.testFun = function () {
            (new testObject()).commonFun();
        }
            
            this.testFun();
    }
            
    test1.qq = 22; // 只有这样直接给函数添加变量,你上面那种取值方式才能取到值
    var test1 = new test1(); // 再次重复,callee和caller是取函数,不是取实例,所以没办法通过这种取到你的test1这个实例里的test变量     
}());

你的这个需求,用继承来实现是最合乎逻辑的。如果是需要子类去实现,可以用接口的方式。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题