2013-06-18 8 views
5

私は質問のタイトルを正しく表現しているかどうかわかりません。 ...明確にするために以下の点を考慮してください`オブジェクト 'のメソッド/プロパティに` this`の継承を拡張する

私は fooの方法/小道具内 thisへのアクセスを有するが thisは初期 object別名 eなく fooを参照持つに行くかどう
(function() { 
    var foo = { 
     bar: function() { 
      // Is it possible to reference 'this' as the 
      // initializing 'object' aka 'e' and not 'foo' ? 
      // The easy part, currently because 'this' refers to 'foo', 
      // is returning 'this' aka 'foo' so that chaining can occur 
      return this; 
     }, 
     other: function() { 
      return this; 
     } 
    }; 
    Event.prototype.foo = foo; 
}()); 

// usage 
document.onmousemove = function(e) { 
    e.foo.bar().other(); 
}; 


私が出ているという最高のは、この

(function() { 
    var foo = function() { 
     var _foo = this.foo; 
     _foo._this = this; //recursive reference that I am VERY worried about 
     return _foo; 
    }; 
    foo.bar = function() { 
     var _this = this._this; //_this refers to initial 'object', 'e' 
     return this; //return 'foo' aka 'this' for function chaining 
    }; 
    foo.other = function() { 
     var _this = this._this; 
     return this; 
    }; 
    Event.prototype.foo = foo; 
}()); 

// usage 
document.onmousemove = function(e) { 
    e.foo().bar().other(); 
}; 

私が現在持っていることは動作しますが、私は物事のカップルが心配です...

1.あります再帰的な参照の参照e.foo._this



2. ee.foo._thisに割り当てる冗長性は、の代わりにeとしてアクセスできる場合は、特に、mousemoveイベントのようなものに関しては、より良いパフォーマンスを出すでしょう。

jsFiddle Here


また、Imはこのような何かを避けるためにしようと...


すべての提案は、あなたの時間をありがとう感謝しています。

+0

私はあなたを正しく理解していれば、基本的に 'foo'オブジェクトとイベントを引き起こした要素の両方にアクセスしたいと思っていますか? – basilikum

+0

@basilikumはい...ちょっと? 'event'自体と' foo'オブジェクトです。 Kindaのような 'this'と' this.foo'。それが理にかなっていれば? – Terry

答えて

2

(function() { 
    var foo = function() { 
     this.foo.event = this; 
     return this.foo; 
    }; 
    foo.bar = function() { 
     /// the event can be found in this.event 
     return this; 
    }; 
    foo.other = function() { 
     /// the event can be found in this.event 
     return this; 
    }; 
    Event.prototype.foo = foo; 
}()); 

// usage 
document.onmousedown = function(e) { 
    e.foo().bar().other(); 
}; 

しかしこれは、共有オブジェクトfooへの変更を行っている、あなたはe.foo()の新しいインスタンスを返すように物事を書き換えすることを望むかもしれませんfooの代わりに他のメソッドをfoo'sプロトタイプに移動します。

(function() { 
    var foo = function(event) { 
     this.event = event; 
    }; 
    foo.prototype.bar = function() { 
     /// the event can be found in this.event 
     return this; 
    }; 
    foo.prototype.other = function() { 
     /// the event can be found in this.event 
     return this; 
    }; 
    Event.prototype.foo = function() { 
     return new foo(this); 
    }; 
}()); 

あなたがfooの新しいインスタンスごとに作成している。この方法で、それはevent財産のあなたの添加は、そのインスタンスに局在していること。プロトタイプ化されたメソッドはすべてのインスタンスで共有されるので、最適化の観点からはそれほど悪くはありません。

+0

非常にクールです...^_^ – Terry

+0

@テリー心配しないでください。 JavaScriptで解決策に近づく方法は常にたくさんありますが、それは私が言語のようにそれを好きにする理由です; – Pebbl

+0

*激しく頭の中で合意する*。私はまだJSの新人ですので、おそらく完全な花の 'ノベルティ'効果ですが、私はそうは思わない。それは非常に表現力豊かな言語であり、私はそれを学ぶのが大好きです。ご協力いただきありがとうございます! – Terry

2

多分それはあなたのために働くだろう:

fooを参照するために呼び出されるメソッドでthisコンテキストを変更し、this.fooを使用するようにapplyメソッドを使用します。

(function() { 
    var foo = function() { 
     console.log(this); 
     return this.foo; 
    }; 
    foo.bar = function() { 
     console.log(this); 
     return this.foo; 
    }; 
    foo.other = function() { 
     console.log(this); 
     return this.foo; 
    }; 
    Event.prototype.foo = foo; 
}()); 

// usage 
document.onclick = function (e) { 
    console.log(
     e.foo.apply(e).bar.apply(e).other.apply(e) 
    ); 
}; 

FIDDLE

+0

+1投票。私は乞食がチョーサーであるべきではないことを知っていますが、より包括的な(それが正しいとすれば?)複数の 'call'または' apply'コールを実現することを望んでいました。にもかかわらず、まだ素晴らしい、感謝basilikum^_^ – Terry

+0

ありがとう! :)まあ、pebblの解決策はまさにそうです。これを解決する非常に良い方法です。 – basilikum

0

たぶんあなたのオブジェクトをオブジェクトにバインドする方が簡単かもしれません:

someElement.onEvent = myObject.myHandlerFunction.bind(myObject); 

この関数が呼び出されると、その 'this'はmyObjectになります。

次に、e.targetを使用して要素にアクセスできます。あなたは物事を簡単にすることができなければならないものに微妙な変更に伴い

関連する問題