タスクは、絶対に2つのオブジェクトをリンクすることです。 オブジェクトのソースコードを変更することはできません。
以下に説明するのは、読者の独立と実装を理解したいという願望のために設計されています。例(誇張)。
家には2つのオブジェクトがあります。
<div id = "a1" onclick = "alert(123)"> </ div>
<div id = "a2"> </ div>
そして1つのJavaScript:
コア=関数(){
this.some = function(a、b、c、d、e、f、g){
var a1 = $( 'a1')。innerHTML
var a2 = a + '' + b + '' + c + '' + d + '' + e + '' + f + '' + g
$( 'a1')。innerHTML = a1 + a2
}
this.another = function(){
var a = $( 'a1')。innerHTML
var a2 = 'some_text_more'
$( 'a1')。innerHTML = a + a2
}
this.another2 = function(){
var a = $( 'a2')。innerHTML
var a2 = 'yahoo'
$( 'a2')。innerHTML = a + a2
}
}
var Core = new Core()
必要:
Core.another2を呼び出して
a1.onclickに応答する
実装:
var n = Observer.Attach($( 'a1')、 'onclick'、Core、 'another')
オブザーバーを削除します。
Observer.Dettach($( 'a1')、n)
オブザーバー。
実装は、追跡オブジェクトメソッドの複製に基づいています。
Observer.Attachはメソッドを複製し、一意の名前を持つ新しいメソッドを作成します。
追跡されたメソッドには、クローン呼び出しと必要な関数の呼び出し(obj2.call_back)を含む新しいアクションが割り当てられます
呼び出しのシーケンスは、Observer.Attachメソッドのbeforeパラメーターによって制御されます。
オブザーバー=関数(){}
Observer.prototype = {
リスト:{}、
添付:function(obj、method、obj2、call_back、before){
var new_method = this.CloneOldMethod(obj、メソッド)
eval( 'obj。' + method + '=' + this.NewDefaultMethod( 'obj2'、call_back、new_method、before))
new_methodを返します
}、
デッタッハ:関数(obj、observed_method){
eval( 'var m = this.List。' + observedmethod)
eval( 'obj。' + m.method + '= m.realization')
eval( 'delete(obj。' + observe_method + ')')
eval( 'delete(this.List。' + observe_method + ')')
}、
NewDefaultMethod:function(obj_name、call_back、new_method、before){
var m_old = 'this。' + new_method + '(引数[0]、引数[1]、引数[2]、引数[3]、引数[4]、引数[5]、引数[6])'
var m_new = obj_name + '。' + call_back + '()'
var cmd = ''
cmd + = 'function(){'
before === true? cmd + = m_new + ';' + m_old:cmd + = m_old + ';' + m_new
cmd + = '}'
cmdを返す
}、
CloneOldMethod:関数(obj、メソッド){
var new_method = 'a' + this.giveUnique()
eval( 'obj。' + new_method + '= obj。' + method)
eval( 'this.List。' + new_method + '= {object:obj、\' method \ ':method、implementation:obj。' + method + '}')
new_methodを返します
}、
giveUnique:function(){
return(新しい日付())。getTime()
}
}
オブザーバー=新しいオブザーバー()