Javascript シンプルなオブザーバー。

タスクは、絶対に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()
	 }
 }

オブザーバー=新しいオブザーバー()


Source: https://habr.com/ru/post/J30312/


All Articles