- ベストアンサー
javascriptでオブジェクトのメソッドを使う
- JavaScriptでオブジェクトのメソッドを使う方法について
- Javaでのsetter getterのようなメソッドを作成して使用することは可能か
- 特定のコードでエラーが発生し、メソッドが存在しないと言われる問題についてのアドバイスを求めています
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
JavaScript における「オブジェクト」とは、「プロパティ」と呼ばれるスロットの集合のことです。クラス・フィールドという概念はありません。また、メソッドとは、プロパティの中身が関数オブジェクトであるようなものです。 まず、最も基本となるオブジェクトを作り、基本プロパティをそこに集約させます。このオブジェクトをプロトタイプと呼びます。そして、オブジェクトは、プロパティをプロトタイプから「借りてくる」ことができます。そうすれば、自分の持つプロパティを節約できます。このとき、プロパティとしてアクセスできないものを「借りてくる」ことはできません(No.0 における mousePosi は何のプロパティでもありません)。 このように、JavaScript では全てがオブジェクトベースで動きます。これを擬似的に「クラス」と呼ぶ人もいますが、この用語は他の用途のためにとっておくべきと思います。 --- // ECMAScript 5 + DOM4 document.addEventListener('mousemove', Object.create(null, new function () { var _x = 0; var _y = 0; this.handleEvent = { value: function handleEvent (e) { this.xy = e; console.log(this.x, this.y); } }; this.xy = { set: function (e) { _x = e.pageX; _y = e.pageY; } }; this.x = { get: function () { return _x; } }; this.y = { get: function () { return _y; } }; })); ECMAScript 5 で導入された Object.create などを使えば、セッタ・ゲッタを定義できます。上では x、y がゲッタになっており、this.x のようにして値の取得は可能ですが、this.x = 0 のように上書きすることはできません。また、xy がセッタになっており、this.xy = event と書くと座標値を上書きしますが、this.xy 取得時は undefined を返します。 --- Object.create 以前なら、 document.addEventListener('mousemove', new function () { var _x = 0; var _y = 0; this.handleEvent = function handleEvent (e) { this.setXY(e); console.log(this.getX(), this.getY()); }; this.setXY = function (e) { _x = e.pageX; _y = e.pageY; }; this.getX = function () { return _x; }; this.getY = function () { return _y; }; }, false); のようになるでしょうが、メソッド(関数プロパティ)自体が上書き可能です(Object.create で生成したプロパティは、特に指定しない限り上書き不可、列挙不可になります)。 --- なお、イベントリスナとして handleEvent を持つオブジェクトを渡せるのは NN6 の独自拡張でしたが、Opera、Safari が追従し、DOM4 で標準化されます。handleEvent 内の this 値はリスナオブジェクトを指します。 また、event.x、event.y は歴史的に難しいプロパティなので、使用を避けた方が無難です。page(X|Y) がページ全体、client(X|Y) が表示域(x、y もこれに統合される予定)、offset(X|Y) が位置指定要素、を基準とする座標です。
その他の回答 (1)
- pringlez
- ベストアンサー率36% (598/1630)
# Uncaught TypeError: Object #<mousePosi> has no method 'setPara' # というエラーが出てしまい、setParaというメソッドはない。と言われて ということはChromeということですよね。何でやっているかという情報はちゃんと書いたほうがいいですよ。 あなたはメソッドと内部関数の違いが理解できていらっしゃらないのでしょう。あなたが書いたコードでは「setPara」は内部関数として定義されています。そして「setPara」というメソッドは存在しません。メソッドが存在しないから「<mousePosi> has no method 'setPara'」というメッセージが出るのです。あなたのコードでできるだけ手を加えずに修正するとこうですかね。 (function LineMain() { console.log("マウスの位置座標を表示"); //マウスムーブでeventControlを呼び出し addEventListener("mousemove", eventControl, false); function eventControl(event) { var myMousePosi = new mousePosi(); myMousePosi.setPara(event); } function mousePosi() { this.paraMouse = { x : 0, y : 0 }; this.setPara = function(event) { this.paraMouse.x = event.x; this.paraMouse.y = event.y; } this.getPara = function() { return this.paraMouse; } } })();