如何找到函数所属的对象?

时间:2013-01-27 00:52:44

标签: javascript

给定一个函数,有没有办法找出持有它的对象?

var dog = { 
  bark: function() { alert('dfd') },
  name: 'Bill'
}

function getNameFromBark(barkFunc){
   //How to implement this method?
}

getNameFromBack(dog.bark); //I would like this to return Bill.

3 个答案:

答案 0 :(得分:1)

为什么不只是dog.name

可以将函数绑定到对象。它可以使用this关键字访问该对象的属性。您可以使用bind函数重新绑定函数,这会更改this的值。

我知道有一种没有的方式来询问函数它绑定的内容。

喜欢:

var my_func = dog.bark; // removing `dog` from the reference
my_func.getBoundObject().name; // would return Bill

答案 1 :(得分:1)

好像你可以在这里使用原型:

function Dog(name) {
  this.name = name;
}

Dog.prototype = {

  getName: function() {
    return this.name;
  },

  bark: function() {
    alert('dfd');
  }

};

var dog = new Dog('Bill');
console.log(dog.getName()); //=> 'Bill'

答案 2 :(得分:1)

您编写代码的方式,dog.bark只是一个函数引用,并且在您将其作为dog.bark传递后与任何特定对象无关联,因此无法获取任何特定对象你刚刚传递它时来自对象的其他数据:

getNameFromBark(dog.bark);

getNameFromBack()内,传递的参数只是一个函数。 javascript中的方法只是对象的属性,一旦检索到属性值,它就只是一个函数。没有与函数本身相关联的对象引用。如果不仅仅使用dog.name来引用全局对象dog,则无法通过其他任何方式从该函数中获取dog.name


现在,您可以通过任意数量的方式对代码进行重构。例如,您可以传递对象而不是函数:

getNameFromBark(dog);

然后,在getNameFromBark()内,您可以从传入的对象访问.name属性。


或者,在某种程度上滥用对象系统时,您可以在函数本身上放置一个包含名称的属性:

var dog = { 
  bark: function() { alert('dfd') },
  name: 'Bill'
}

// assign name property to the bark function too
dog.bark.name = dog.name;

function getNameFromBark(barkFunc){
   //How to implement this method?
   return(barkFunc.name);
}

getNameFromBack(dog.bark); //I would like this to return Bill.

但是,这可能不是设计代码的最佳方式。如果我们理解您试图解决的真正问题,我们可能会建议一个更好的面向对象的体系结构,它不会重复属性。