如何获取调用函数的名称?

时间:2016-11-11 00:25:57

标签: javascript

让我们考虑一下这个代码示例:

function Bird() {
    var self = this;
    this.getType = function() {
        return self.type;
    };
}
function Eagle() {
    Bird.call(this);
    this.type = "Eagle";
}
function Sparrow() {
    Bird.call(this);
    this.type = "Sparrow";
}
function Bat() {
    Bird.call(this);
    this.type = "Bat";
}

var e = new Eagle();
console.log(e.getType());

此处Bird类型已正确设置,但我想确定Bird级别的类型。但是,要实现这一点,我需要知道哪个函数叫Bird。但是,如果我做这样的事情:

function foo() {
    return new Bird();
}

然后我想确保foo().getType()导致undefined。这可能吗?

2 个答案:

答案 0 :(得分:2)

您不需要使用电话:

function Bird(self) {
  var type;
  if (self) {
    type = self.constructor.name;
  } else {
    self = this;
  }
  self.getType = function () {return type;};
}
function Eagle() {
   Bird(this);
}
var e = new Eagle();
console.log(e.getType()); // Eagle
console.log(new Bird().getType()); // undefined

答案 1 :(得分:1)

使用

self.constructor.name

获取对象的名称。 正如@Lojas Arpad建议的那样,设置类型一次,这样就不需要每次比较了。



function Bird(self) {
  var self = this;
  var type = self.constructor.name === 'Bird' ? undefined : self.constructor.name;
  this.getType = function() {
    return type
  };
}

function Eagle() {
  Bird.call(this);
}

function Sparrow() {
  Bird.call(this);
}

function Bat() {
  Bird.call(this);
}

var e = new Eagle();
console.log(e.getType());

function foo() {
  return new Bird();
}
console.log(foo().getType())