• ベストアンサー

【javascript】『-』や『+』を再定義したい。

引数にエレメントを指定するとエレメントの座標を返すfancitonを作りました。(行頭は全角スペースです。) function getLocation(element){  var x=0,y=0,p=element;  while(p){   x+=p.offsetLeft - p.scrollLeft;   y+=p.offsetTop - p.scrollTop;   p=p.offsetParent;  }  return {x: x,y: y}; }; たとえば、これを以下の様にして使うのですが、 locA=getLocation(getElementById("AAA")); locB=getLocation(getElementById("BBB")); locAとlocBの差分を求めたいとき、 def={x: (locA.x - locB.x),y: (locA.y - locB.y)} といちいち書かなくてはならず面倒です。 fanciton def(a,b){ return {x: (a.x-b.y),y: (a.y-b.y)}; }; のようなfancitonを作れば少しは楽になるでしょうけど、 def = locA - locB; と書けるようになると、イイなぁと思います。 {x: x,y: y}と定義したオブジェクトに対する『-』や『+』を再定義する事はjavascriptでは、できないものでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • a0205s
  • ベストアンサー率100% (4/4)
回答No.3

>{x: x,y: y}と定義したオブジェクトに対する『-』や『+』を再定義する事はjavascriptでは、できないものでしょうか? No.1の方の参考URL先にもありますように、javascriptでは演算子のオーバーライドを行う事は言語の仕様上行えません。 確かにこういった実装が行えれば便利だし、楽しそうですが・・ こればかりは我慢するしかないかと思います。

kingfruits
質問者

お礼

a0205sさん ご回答ありがとうございます。 そうですか、できないですか。 そう言って頂けると、あきらめがついて助かります。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

ご自身で関数を定義するほかはないでしょう。 関数に簡単な名前を用いれば、「+」や「-」と比べても そこまで記述量に変化はないはずです。

kingfruits
質問者

お礼

heikuu2009さん、ご回答ありがとうございました。 >>ご自身で関数を定義するほかはないでしょう。 『+や-を関数として定義したい』が命題ですから、そうするほかないと いうか、そうしたいのです。 >>関数に簡単な名前を用いれば、「+」や「-」と比べても >>そこまで記述量に変化はないはずです。 簡単な名前のメソッドで書くと以下の様になりました。 <html> <head> <script type="text/javascript" src="prototype.js"></script> </head> <body> <script type="text/javascript"> var Loc = Class.create(); Loc.prototype = {  initialize: function(x,y){   this.x = x;   this.y = y;   return {x:x,y:y};  },  add: function(loc){   return {x: this.x+loc.x,y: this.y+loc.y};  },  sub: function(loc){   return {x: this.x-loc.x,y: this.y-loc.y};  } }; a= new Loc(5,10); b= new Loc(3,3); c=a.sub(b); alert(c.x + ':' + c.y); </script> </body> </html> 演算子『-』を再定義して、 c=a.sub(b); ではなく c=a-b; と書きたいのです。 ご指摘の様に、記述量に変化は大差ないのですが、c=a-b;と記述できたら、カッコイイかなぁと思いまして。

全文を見る
すると、全ての回答が全文表示されます。
  • tasoh
  • ベストアンサー率45% (19/42)
回答No.1

http://www.mozilla-japan.org/js/language/js20/rationale/operators.html これのことでしょうか? 下のほうに例が載ってます

参考URL:
http://www.mozilla-japan.org/js/language/js20/rationale/operators.html
kingfruits
質問者

お礼

tasohさん、ご回答ありがとうございました。 ご提示して頂いたURLの『演算子のオーバーライド』ってのが、そうなのかもしれませんが、よくよく読んでみましたが、ちょっとコレではやりたい事が出来ませんでしたが、アドバイスありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • javascript初心者です。

    javascript初心者です。 特定要素の相対座標位置を取得したく、getBoundingClientRect()を使用しているのですが、firefox2.0でも、見れるようにしなくてはいけなくて、その場合、getBoundingClientRect()がfirefox2.0では使えません。 それに変わる関数などを探していましたが、わからなかったので、下記のソースを var element = document.getElementById("sample"); var elementY = element.getBoundingClientRect() 以下のように変えてみました。 var element = document.getElementById("sample"); var elementY = element.offsetTop - window.screenY; ですが、予期した値が取得できません。 ページ内で、スクロールすると、elementYが変わるようになっています。 どう書き換えたらよいか、どなたかご教授お願いいたします。

  • rubyでScalaのようにコールバックを変数として定義するには?

    rubyでScalaのようにコールバックを変数として定義するには? 最近Scalaの勉強を始めました。自分の一番好きな言語はrubyなので、比較しながら勉強してます。 参考書によると、関数をオブジェクトとして扱えるのがScalaの特徴との説明がありました。例えば、以下のような例なのですが、(行頭スペースは全角) class Kuku(a:Int,b:Int){  def calc(func:(Int,Int)=>String):String={   return func(a,b)+a*b  } } val f1=(a:Int,b:Int)=>a+"*"+b+"=" println(new Kuku(3,5).calc(f1)) これをrubyで書くと、(行頭スペースは全角) class Kuku  def initialize(x,y)   @x=x   @y=y  end  def calc   yield(@x,@y)+(@x*@y).to_s  end end puts Kuku.new(3,5).calc{|a,b| a.to_s+'*'+b.to_s+'='} とまでは書けたのですが、コールバック(ブロックパラメータの部分)、上記例だと |a,b| a.to_s+'*'+b.to_s+'=' の部分 を変数として定義(Scalaの例のf1として定義するところ)する方法を知りません。 このように関数を変数として定義する事ってrubyではできないと考えるのですが、そういった認識で間違いないでしょうか? ご指導の程、よろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • 順序対(x,y)の定義の記号について

    こんにちは.順序対について質問します. 順序対を求めることは,分かるのですが,下記の順序対の定義の意味がわかりません. x,yの順序対の定義は, (x,y)≡{{x},{x,y}} と定義されます. たとえば, X={a,b},Y={c}という集合である場合, 順序対X*Y={(a,c),(b,c)}となりますが, この定義は,どのように解釈すればよいのでしょうか? (前提) 集合X,Yの2つの要素x∈X,y∈Yについて,{x,y}は集合となる.また,{x}={x,x}も集合となるので,{{x},{x,y}}も集合となる.

  • 二項演算子の定義

    二項演算子の定義 rubyを学び始めた超初心者です。プログラム経験はありません。 参考プログラム、下記を入力しましたが2箇所?納得ができません 笑われるような質問なのかどこを探しても解決できません。 よろしくご教授願います。 12行,16行 Vec.new(@x + other.x, @y + other.y) other., other.yの表記の意味が理解できません。 class定義が終了していないのに使用している 1 class Vec 2 attr_reader :x, :y 3 def initialize(x=0, y=0) 4 @x, @y = x, y 5 end 6 7 def inspect #表示用 8 "(#{@x}, #{@y})" 9 end 10 11 def +(other) 12 Vec.new(@x + other.x, @y + other.y) # x, y のそれぞれを足す 13 end 14 15 def -(other) 16 Vec.new(@x - other.x, @y - other.y) # x, y のそれぞれを引く 17 end 18 end 19 20 vec0 = Vec.new(3, 6) 21 vec1 = Vec.new(1, 8) 22 23 p vec0 24 p vec1 25 p vec0 + vec1

    • ベストアンサー
    • Ruby
  • javascriptによるスクロールを縦から横に変換したい

    拾ったソースを改造しようとしているのですが 知識がない為うまくいきません。 divの中のsample1~10を横に並べて、改行なしの横スクロールにしたいです。 今は縦スクロールです。 どこを直せばいいのか教えてくださいm(_ _)m ―――――――――――――――――― <SCRIPT language="JavaScript"> <!-- var SmoothScroll = {}; SmoothScroll = { targetScrollTop : 0, dist : 0, timer : 0, count : 0, parentid : 0, lastDist : 0, //speedStore : [], options : {}, defaultOptions : { time : 1*1000, unit : 50 }, scrollTo : function( element, parent, options ){ this.options.time = this.defaultOptions.time; this.options.unit = this.defaultOptions.unit; if( options ){ this.options.time = ( options.time ) ? options.time : this.options.time; this.options.unit = ( options.unit ) ? options.unit : this.options.unit; } clearInterval( this.timer ); this.parentid = parent; this.scrollTopMax = this.$(parent).scrollHeight - this.$(parent).offsetHeight + parseInt(this.$(parent).style.borderTopWidth) + parseInt(this.$(parent).style.borderBottomWidth); if( navigator.userAgent.match( "MSIE" ) ){ this.targetScrollTop = ( element ) ? this.$(element).offsetTop : 0; }else{ var targetOffsetTop = ( element ) ? this.$(element).offsetTop : this.$(parent).offsetTop; this.targetScrollTop = targetOffsetTop - this.$(parent).offsetTop; } this.targetScrollTop = ( this.targetScrollTop > this.scrollTopMax ) ? this.scrollTopMax : this.targetScrollTop; this.dist = this.targetScrollTop - this.$(parent).scrollTop; this.lastDist = 0; this.timer = setInterval('SmoothScroll.update()', this.options.unit ); this.count = 0; //this.speedStore = []; this.update(); }, update : function(){ var dist = this.targetScrollTop - this.$(this.parentid).scrollTop; var speed = 2 * dist * this.options.unit / ( this.options.time - this.options.unit * this.count ); //this.speedStore.push( speed ); speed = ( speed > 0 ) ? Math.ceil( speed ) : Math.floor( speed ); if( Math.abs(dist) <= Math.abs(speed) ){ // got there clearInterval( this.timer ); this.$(this.parentid).scrollTop = this.targetScrollTop; return; }else if( this.lastDist == dist ){ // stuck clearInterval( this.timer ); this.$(this.parentid).scrollTop = this.targetScrollTop; return; } var scrollTop = this.$(this.parentid).scrollTop + speed; this.$(this.parentid).scrollTop = scrollTop; this.lastDist = dist; this.count++; if( this.count == this.options.time / this.options.unit ){ // timeout clearInterval( this.timer ); this.$(this.parentid).scrollTop = this.targetScrollTop; } }, $ : function(id) { return document.getElementById(id); } } --> </script> <div id="scrolltop" style="width: 750px; height: 200px; overflow-x: scroll; overflow-y: scroll; border: 1px black solid;"> <a href="sample1">1</a> <a href="sample2">2</a> <a href="sample3">3</a> <a href="sample4">4</a> <span id="middle" style="color: red"> <a href="sample5">5</a> </span> <a href="sample6">6</a> <a href="sample7">7</a> <a href="sample8">8</a> <a href="sample9">9</a> <span id="bottom" style="color: blue"> <a href="sample10">10</a> </span><br /> </div> <input type="button" value="go to top" onclick="SmoothScroll.scrollTo(0,'scrolltop');"/> <input type="button" value="go to middle" onclick="SmoothScroll.scrollTo('middle','scrolltop');"/> <input type="button" value="go to bottom" onclick="SmoothScroll.scrollTo('bottom','scrolltop');"/>

  • outlook2010の不具合で困っていますTT

    助けてください。 昨日朝まで普通に送受信できていたoutlookですが、昨晩から突然『応答なし』状態でフリーズしていしまいます。 officeの修復を行っても状況が変わらずだったので、再インストールしたのですが状況はかわらないままです。 フリーズ状態のまま一晩おき朝確認したところ、ファイルのダウロードのダイヤログボックスがたちあがっていたので保存しました。(HTMLファイルでメモ帳でひらいたものを下記に記載します。) また、その際『送り手側と受け取り手側のフォルダがいっしょです』と表示されました。 一晩おいたせいかメールは受信されていましたが、outlookをいじるとフリーズしていしまい、中身を確認することができません。 googleで対応を検索したのですが、うまく探すことができません。 週末までにしあげなくてはいけない、課題があり本当に困っています。 学校での課題があり、PCがつかえないので本当に困っています。 また、PC初心者なので、わかりやすい説明でお願いできれば幸いです。 どうぞ、よろしくお願いいたします。 --- ダウンロードしたファイルの内容--------------------------------------------------- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!-- saved from url=(0014)about:internet --> <html> <head> <link rel="stylesheet" href="res://C:\Program Files (x86)\Microsoft Office\Office14\1041\SocialConnectorRes.dll/activityfeed.css" type="text/css" /> <script language="javascript"> // Setup ------------------------------------------------------------------------------------------- window.onload = Init; // Function defined below // Globals ----------------------------------------------------------------------------------------- var g_ContextMenuCtrl = null; // Functions --------------------------------------------------------------------------------------- function SetContextMenuIdleImg(img) { img.src = "res://C:\\Program Files (x86)\\Microsoft Office\\Office14\\1041\\SocialConnectorRes.dll/PNG/#133"; } function SetContextMenuHoverImg(img) { img.src = "res://C:\\Program Files (x86)\\Microsoft Office\\Office14\\1041\\SocialConnectorRes.dll/PNG/#134"; } function SetContextMenuDownImg(img) { img.src = "res://C:\\Program Files (x86)\\Microsoft Office\\Office14\\1041\\SocialConnectorRes.dll/PNG/#135"; } function Init() { document.oncontextmenu = NullEventHandler; g_ContextMenuCtrl = document.getElementById("AFContextMenuObj"); } function GetFirstChildImg(a) { return a.getElementsByTagName('img')[0]; } function GetLeftX(element) { var left = 0; if (element.offsetParent) { do { left += element.offsetLeft; element = element.offsetParent; } while(element); return left; } return 0; // Error... } function GetRightX(element) { var width = parseInt(element.width); var left = GetLeftX(element); return left + width; } function GetTopY(element) { var top = 0; if (element.offsetParent) { do { top += element.offsetTop; element = element.offsetParent; } while(element); return top; } return 0; // Error... } function GetBottomY(element) { var height = parseInt(element.height); var top = GetTopY(element); return top + height; } function GetContextMenuX(img) { return GetRightX(img) - GetLeftX(g_ContextMenuCtrl) - document.body.parentElement.scrollLeft; } function GetContextMenuY(img) { return GetBottomY(img) - GetTopY(g_ContextMenuCtrl) - document.body.parentElement.scrollTop; } function OnContextMenuClick(img, entryId) { SetContextMenuDownImg(img); var x = GetContextMenuX(img); var y = GetContextMenuY(img); g_ContextMenuCtrl.ShowContextMenu(x, y, entryId); } function OnAttachmentContextMenuClick(img, entryId, attachNum, displayName) { SetContextMenuDownImg(img); var x = GetContextMenuX(img); var y = GetContextMenuY(img); g_ContextMenuCtrl.ShowAttachmentContextMenu(x, y, entryId, attachNum, displayName); } function NullEventHandler(event) { return false; } </script> </head> <body class="normal_text" style="direction: ltr" oncontextmenu="return false;"> <p class="hardcodedMessage">このビューにはアイテムがありません。</p> </body> </html>

  • 放物線の定義の問題です

    (問題)焦点のx座標が3、準線が直線x=5で、点(3,-1)を通る放物線の方程式を求めよ。 (解答)焦点の座標を(3,b)とすると準線が直線x=5であるから頂点の座標は(4,b)である。     従ってもとめる方程式は(y-b)^2=4p(x-4)となる。     定義より、2p=3-5=-2 よってp=-1     これが点(3,-1)を通るから、代入してbを求めるとb=-3,1     よって求める方程式は (y+3)^2=-4(x-4) (y-1)^2=-4(x-4) この解答で、「定義より、2p=3-5=-2 よってp=-1」の部分がわかりません。 3-5=-2とマイナスになっているのは、なぜなのでしょうか? よろしくお願いします。

  • 基底Bで生成される位相と部分基底で生成される位相の定義について質問

    英語での講義で 基底Bで生成される位相と部分基底で生成される位相の定義がわからず困っています。 Def If X is a set,a basis for a topology on X is a collection B of subsets of X (called basis elements) such that (1) For each x∈X,there is at least one basis element b containing x. (2) If x belongs to the intersection of two basis elements b_1 and b_2,then there is a basis element b_3 containing x such that b_3⊂b_1∩b_2. Xを集合とし,B∈2^XがXの位相の基底 ⇔(def) (i) ∀x∈X,∃b∈B;x∈b. (ii) x∈b_1∩b_2⇒∃b_3∈B;x∈b_3⊂b_1∩b_2 の解釈で正しいでしょうか? If B satisfies these two conditions, then we define the topology T generated by B as follows: A subset U of X is said to be open in X (that is ,to be an elemnt of T) if for each x∈U,there is a basis element b∈B such that x∈b and b⊂U. Note that ezchd basis elements is etself an element of T. T(∈2^X)はXの位相の基底Bから生成される位相 ⇔(def) ∃U∈T such that (x∈U⊂X⇒∃b∈B;x∈b且つb⊂U) で正しいでしょうか? Def A subbasis S for a topology on X is a collection of subsets of X whose union equals X. The topology T' generated by the subbasis S is defined to be the collection T of all unions of finite intersectoins of elements of S. SをXの位相の部分基底(位相の基底の部分集合)とするとX=∪[b∈S]bとなる。この時, T'はSで生成される位相 ⇔(def) A:={∩[i=1..n]b_i;b_i∈B (i=1,2,…,n)} T:=∪[a∈A]a T'⊂T.

  • 演算子の再定義とインスタンス変数の参照と代入

    list9.1とlist 9.3をあわせた二次元の座標、xとyを持つ プログラムです class Point attr_reader :x, :y def initialize(x=0, y=0) @x, @y = x, y end def inspect # 表示用 "(#{x}, #{y})" end def +(other) # x、yのそれぞれを足す self.class.new(x + other.x, y + other.y) end def -(other) # x、yのそれぞれを引く self.class.new(x - other.x, y - other.y) end def [](index) case index when 0 x when 1 y else raise ArgumentError, "out of range `#{index}'" end end def []=(index, val) case index when 0 self.x = val when 1 self.y = val else raise ArgumentError, "out of range `#{index}'" end end end point = Point.new(3, 6) p point[0] #=> 3 p point[1] = 2 #=> 2 p point[1] #=> 2 p point[2] #=>エラー(ArgumentError) についてお尋ねしたいのですが、 def [](index)で演算子を再定義する際、値を参照する方法で def [](index)  case index  when 0   x   : と、していますが、xp.135のアクセサの説明など では@xと「@」が要りそうな感じがするのですが、この 場合は省いて大丈夫なんでしょうか? プログラムがローカル変数と間違って処理したりという ことは無いんでしょうか。 仮にないとすれば、ここのcase文にはインスタンス変数 と同じ名前のローカル変数などは定義できないのでしょうか? ご教授願います。

    • ベストアンサー
    • Ruby
  • ブラウン運動の定義と結合分布

    http://www.math.u-ryukyu.ac.jp/~sugiura/2010/sde10.pdf に書かれていること(主に4page後半から5pageの頭)に関しての質問なんですが, 確率空間(Ω,F,P)上定義された(実数値)確率過程 B={B_t ; t≧0} がブラウン運動であることの定義から 定義(もしくは定義から導ける):「0=t_0<t_1<t_2<…<t_n に対し, {B_(t_i)-B_(t_(i-1))}_{1≦i≦n} は独立」なので A1,…An をボレル集合とすれば P( B_(t_1)-B_(t_0)∈A1,…,B_(t_n)-B(t_(n-1))∈An ) =P( B_(t_1)-B_(t_0)∈A1 )…( B_(t_n)-B(t_(n-1))∈An ) さらに「定義: 0≦s<t に対し, B_t-B_s は平均 0,分散 t-s のGauss分布に従う」 から P( B_(t_1)-B_(t_0)∈A1,…,B_(t_n)-B(t_(n-1))∈An ) =∫_A1…∫_An Πp(t_i-t_(i-1),x_i) dx_1…dx_n Πは i=1からnにわたる積 p(t,x)=1/√(2πt)*exp(-x^2/(2t)) を得る.ここから y_0=0, x_i=y_i-y_(i-1) (i=1,…,n) という変数変換によって P( B_(t_1)-B_(t_0)∈A1,…,B_(t_n)-B(t_(n-1))∈An ) =∫_{y_1∈A1}…∫_{y_n-y_(n-1)∈An} Πp(t_i-t_(i-1),y_i-y_(i-1)) dy_1…dy_n と書き換える. ここまでは理解できるのですが,ここからいきなり P( B_(t_1)∈A1,…,B_(t_n)∈An ) =∫_{y_1∈A1}…∫_{y_n∈An} Πp(t_i-t_(i-1),y_i-y_(i-1)) dy_1…dy_n が得られることがわかりません.どういう過程を経てこの式を得たのでしょうか? 教えてください.よろしくお願いします.