1

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

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.
4

3 回答 3

1

为什么不只是dog.name

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

据我所知,没有办法询问一个函数它绑定到什么。

喜欢:

var my_func = dog.bark; // removing `dog` from the reference
my_func.getBoundObject().name; // would return Bill
于 2013-01-27T00:55:51.540 回答
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'
于 2013-01-27T01:02:33.003 回答
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.

但是,这可能不是设计代码的最佳方式。如果我们了解您要解决的真正问题,我们可能会建议一种更好的面向对象架构,它不会复制属性。

于 2013-01-27T01:39:58.720 回答