関数が与えられた場合、それを保持しているオブジェクトを見つける方法はありますか?
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.
関数が与えられた場合、それを保持しているオブジェクトを見つける方法はありますか?
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.
なぜだけではないのdog.name
ですか?
関数はオブジェクトにバインドできます。this
キーワードを使用して、そのオブジェクトのプロパティにアクセスできます。bind
関数を、の値を変更する関数で再バインドできますthis
。
関数に何がバインドされているかを尋ねる方法はありません。
お気に入り:
var my_func = dog.bark; // removing `dog` from the reference
my_func.getBoundObject().name; // would return Bill
ここでプロトタイプを使用できるようです:
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'
コードを記述した方法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.
しかし、これはおそらくコードを設計するための最良の方法ではありません。あなたが解決しようとしている本当の問題を理解していれば、プロパティを複製しない、はるかに優れたオブジェクト指向アーキテクチャを提案できるでしょう。