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 に答える