JavascriptでのGetおよびSetのカスタム使用

多くの人は、Javascriptにいわゆるゲッターとセッターが存在することを知っています。 これらは、オブジェクトプロパティ値の変更を追跡し、これらの値を返すための構造です。 オブジェクトの内部からは、通常の関数のように見えます。



var obj = {

get value() {

return 0;

},

set value(s) {

alert ( "Go screw yourself!" )

}

}




* This source code was highlighted with Source Code Highlighter .








ただし、これらは関数であるため、必要に応じて使用できます。







たとえば、特定のHTML要素のCSSでの作業を簡素化するコンストラクターを作成できます。

function $( object ) {

if ( typeof ( object )== "string" ){ object = document .getElementById( object )};

object .__defineGetter__( "x" , function (){

return (parseInt( object .style.left))

}),

object .__defineSetter__( "x" , function (n){

object .style.left = n + 'px'

}),

object .__defineGetter__( "y" , function (){

return (parseInt( object .style.left))

}),

object .__defineSetter__( "y" , function (n){

object .style.top = n + 'px'

})

}




* This source code was highlighted with Source Code Highlighter .








これで、 $("btn1").x = 56



書くことで、ID "btn1"のボタンに移動できます。



しかし、Getters and Settersの魅力は、CSSを使用するなどの日常的なタスクを単純化することだけではありません。 これらは、言語自体の概念を変更するためにも使用できます。



たとえば、次の例は画面にメッセージを表示します。



obj = {

set message(s) {

alert(s)

}

}



obj.message = "Hello, World!"




* This source code was highlighted with Source Code Highlighter .








怖い 私の意見では、非常に。 この問題の主なものは、不条理のポイントに到達しないことです。 これには数学的なアプリケーションがあります。



たとえば、valueプロパティとsinプロパティを持つObjオブジェクトがあります。 sinプロパティに目を向けると、値のサインを取得します。 ポイントは、Setterを使用すると反対のことができるということです。 そして、罪を変えた後、価値も変わります。 つまり、sin == 0.5の場合、value = Math.PI / 6です。



obj = {

value: 0,

get sin() {

return Math.sin( this .value)

}

set sin(n) {

this .value = Math.asin(n)

}

}




* This source code was highlighted with Source Code Highlighter .








ソリューションが完全にクロスブラウザではないことに注意してください。 これらすべてをお気に入りのInternet Explorerブラウザーに移植する場合は、__ defineGetter __()および__defineSetter __()、またはここで説明されているメソッドを使用する必要があります。



しかし、ゲッターとセッターには本当に多くの機会があります。 すべてを同じAJAXと組み合わせると、次のような完全なコーシャの外観を実現できます。



ajax.url = "script.php"

alert(ajax.result)




* This source code was highlighted with Source Code Highlighter .








もちろん、これは、割り当て操作が割り当て(実際には、値を取得する操作のような)だけを行うという事実に慣れている一部のプログラマを混乱させます。 ただし、Obj.Destroy = trueを確実に記述できるユーザーはいないため、.Destroy()など、パラメーターのないメソッドを使用する必要があります。 ティックタイムアウトのようなことをするという考えがあります。 すべての取得および設定を追跡します。 これは、Obj.Destroy = 5が5つのget / set操作でオブジェクトを破棄することを意味します。 しかし、これはもちろん、すでに不必要な創造性です。



All Articles