• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:プロパティ宣言をスマートに書くには?)

プロパティ宣言をスマートに書くには?

このQ&Aのポイント
  • コードをスマートにするため、Questionを一度だけ書くアルゴリズムに変更したい。
  • 現在のコード(1)では、Questionのコードを複数回書く必要があるため、量が多くなってしまう。
  • 目的は、Questionのコードを一度だけ書けるようにすることで、コードをスマートにすること。

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

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.3

(2)のコードではQuestion.gooなどに console.info('goo') の戻り値を入れているので、 そもそもコードが(1)と等価ではありません。 Question.goo()はconsole.info('goo')が返したfunctionを実行しますし、 もしconsole.info('goo')がfunctionを返すのでなければ Question.goo();は実行できません。 ケアレスミスなら良いのですが、なにか勘違いされている可能性もありますので一応指摘しておきます。 > jQueryがprototype.jsとのバッティングを回避できるように、$xQuery でも回避できるように対策したいのです。 それなら、jquery.jsを読んでみてはいかがでしょうか。 私もjquery.jsは見たことなかったので今軽く眺めてみましたが、 読めば結構勉強になると思いますよ。 jQueryでの$の衝突回避は var _$ = window.$ として、元の$を退避して戻せるようにしているようです。 質問の件はこのように書いてみてはどうですか? ---------------- (function(){ //Question以外の名前にしたければ、window.Questionのところを書き換える。 var _Question = window.Question = function(){ console.info('OKWave!'); } _Question.goo = function(){ console.info('goo'); } _Question.tagindex = function(){ console.info('TAG index'); } })(); Question(); Question.goo(); Question.tagindex(); ---------------- > # 他に、記述量を減らす目的なら prototypeプロパティを利用しても良い、と気が付きました。 > String.prototype.csv2tableNode = function(csv, option){...} 組み込みオブジェクトのprototypeにプロパティをやたらに追加するのは、お勧めできません。 Stringとの関連が低そうなメソッドですし。 [参考] 特集:jquery.jsを読み解く|gihyo.jp … 技術評論社 http://gihyo.jp/dev/feature/01/jquery

think49
質問者

お礼

ありがとうございます。 JavaScriptに作法というものがあるのかわかりませんが、 良くわかっていない頭でおかしなことをしているのじゃないかとひやひやしていました。 求めている動作が実際に出来ることがわかってほっとしています。 > そもそもコードが(1)と等価ではありません。 確かにそうですね。ミスでした。ご指摘有り難うございます。 > それなら、jquery.jsを読んでみてはいかがでしょうか。 実は私もjQueryは眺めたのですが、私の理解度が浅いために解読できませんでした。 > として、元の$を退避して戻せるようにしているようです。 なるほど!そういう意味だったのですか! window.$ をFirebugコンソールで実行すると undefined が返ってくるため、何をやっているのかさっぱりな状態だったのですが、 prototype.js などで $ を宣言していた場合に備えて、待避していたのですね。 > 質問の件はこのように書いてみてはどうですか? ありがとうございます。求めている動作になりました。 試してみてわかりましたが、 window.Question = function(){ console.info('OKWave!'); }; と Question = function(){ console.info('OKWave!'); }; は等価なのですね。勉強になりました。 > 組み込みオブジェクトのprototypeにプロパティをやたらに追加するのは、お勧めできません。 やはりよくないですね。prototypeに加えるのは既存メソッドを少し拡張したような汎用性の高いメソッドに留めようと思います。 紹介していただいた技術評論社の特集は私にも理解できそうな内容なので、時間のあるときにじっくり読み進めてみようと思います。 有り難うございました。

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

その他の回答 (4)

回答No.5

そうじて当初の質問から、どんどんかけ離れていることにお詫びします。 >> 個々の要素にイベントを記述する方が、圧倒的に多いようです。 >えっと…、そんなに多いでしょうか? あっ、あなたではなく広く一般的にね^^; >質問者さんに伝える場合においては必ずしも必要ではないと >質問者さんの知っているレガシーな方法 これまでの方々の質疑応答を見ていて、質問者は必ずしも勉強するために 質問しているのではなく、その場を切り抜けるためだけに質問しているように 見受けられます(あくまでも個人的に) なので、質問者に理解される必要はなく、そのコードを見て、 「えっ!なんでこんな書き方するの?」って思う人が勉強すれば良いと思う。 (自分を省みるとよくわかります。何をやっても駄目なやつは駄目。 たとえば、いまだにメモリーリークについてよく理解できてなし、指摘される。) これから勉強しようとする人には、レガシーなコードより オブジェクト指向なり、最新のブラウザに対応するなら、こう書くんだよ!と 進んで見本となるものを書いてあげてたほうが良いと思っています。 (それができないのが、ちょっぴりくやしい。) なんたってここは、技術者向の板なのだし・・・・ 質問者で、「知っているなら書いてくれ!」という人は嫌われる。 同じ用に、「最新の書き方ができるなら、それで書いてくれ!」というのと 同じようなものかぁ。 XPathかぁ~勉強しなきゃね~。 つうかそれより日本語だね。読み直してそう思う。 まぁ~~~まだ生まれたて(登録したて?^^;)だということで許してね。 ばぶぅ。

think49
質問者

お礼

> そうじて当初の質問から、どんどんかけ離れていることにお詫びします。 その点は私も理解した上で補足していましたので、お気になさらず。 情報を求めてここを閲覧されている方には申し訳ないですが、私自身に問題や改善点があれば遠慮なく指摘を頂きたいと思っています。 > >> 個々の要素にイベントを記述する方が、圧倒的に多いようです。 > >えっと…、そんなに多いでしょうか? > > あっ、あなたではなく広く一般的にね^^; あっ、そういうことでしたか。 「方 = ほう」と読んでいましたが、「方 = かた」なのですね。失礼しました。 > これまでの方々の質疑応答を見ていて、質問者は必ずしも勉強するために > 質問しているのではなく、その場を切り抜けるためだけに質問しているように > 見受けられます(あくまでも個人的に) これは良くわかります。 ここだけでなく、様々なコミュニティでその傾向が見受けられます。 なので、私も質問者さんのためというよりは掲示板を閲覧している第三者のために質問者さんには理解できないかもしれない情報を掲載することはあります。 あと、私自身の落としどころとして「私が勉強するために回答する」というように考えています。 私が興味を持った分野、試してみたいアイデアを質問文に見つければそれを実験してみる。 その結果、私も掲示板を閲覧している人も(できれば)質問者さんも勉強になれば、幸せなことだと思います。 何度も時間を取っていただき、ありがとうございました。 回答者としての姿勢がとても参考になりました。

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

#1です。 >同じ状況に立った場合にどのように対策 専門家でもないし、どうこう言える立場でもございません。 お役にたてそうもありません。ごめんなさい。 どのような関数をどう定義するかもわからないのですから 答えようがありません。 ただ回答者側のコードを見ていて思うのですが、 個々の要素にイベントを記述する方が、圧倒的に多いようです。 TAG indexなどで記述されたコードを見て勉強している者からすると なんだかなぁ~と思うことが多々あります。(腕は未熟者ですが) csvなんてキーワードがあるくらいなので、規則性のある表?(データ) なのでしょうか? たとえば個別のセルにイベントを貼り付けなくても、 tableにonclickのイベントを1つくっつけておけば、どのセルを クリックしたか調べることはできます。 そこからその列の処理に移れば良しと考えています 自分は、結果をもとめられる立場ではないので、いきなり 数行ですげーことをして仕事に役立てる必要はありません。 むしろ、原理というか基礎というかそのへんを学びたいのです。 自分からは、XPathなんて遠い所にあります。^^; お~キャラが消えていた。 ばぶぅ~。

think49
質問者

お礼

2度にわたるアドバイスありがとうございました。 babu_babooさんはコードを必ず掲載する回答者さんと認識しており、いくつか参考にさせていただいています。

think49
質問者

補足

> 個々の要素にイベントを記述する方が、圧倒的に多いようです。 えっと…、そんなに多いでしょうか? 現時点で8件の回答をしていますが、イベントを定義したコードを掲載したのは qa4928371 のみだと認識しています。 何か勘違いしているのでしょうか…。 ちなみに、qa4928371に関しては質問者さんにわかりやすいようにあえてHTML埋め込み型の書き方をしています。 # 綺麗なコードは書けるにこしたことはないのですが、質問者さんに伝える場合においては必ずしも必要ではないと考えています。 # 質問者さんの知っているレガシーな方法でコードを書いた方が伝わることもありますし、 # 例外処理までしっかり書いた長いコードよりも、シンプルな短いコードの方が伝わりやすいこともあります。ケースバイケースだと思います。 きちんと清書したら、node.onclick = function(){ ... }; でしょうか。 できることならイベントリスナを使いたいところですが、IE未対応なので仕方なく。 addEventListenerをオーバーロードするやり方もあるようですが、イベント実行順に癖があるようなので採用していません。 > csvなんてキーワードがあるくらいなので、規則性のある表?(データ)なのでしょうか? おおざっぱに言ってしまえば、DOMで操作する要素ノードを返すメソッド、と思っていただければイメージできるかと思います。 var xpath = 'p#Test/strong[@title="test"][text()="It is a test."]'; document.body.appendChild($xQuery(xpath)); と var p = document.createElement('p'); p.id='Test'; var strong = document.createElement('strong'); strong.appendChild(document.createTextNode('It is a test.')); strong.title='test'; p.appendChild(strong); document.body.appendChild(p); は等価です。(IDセレクタは本来XPathではないですが、短い記述量が魅力的だったので採用しました) 階層の深い要素ノード、属性の多い要素ノードを短い記述で宣言できるのが最大の特徴です。 csv2array はCSVを2次元配列に変換して返します。 返ってきた配列を操作した上で array2tableNode で要素ノードに変換し、appendChildなどでページに追加することができます。 ちなみに array2tableNode でもXPathを利用していて、無指定だと単純なtableを。 "table#chat\ncaption[text()='簡易チャット']" を指定すると、<table ="Chat">、一行目がth、<caption>簡易チャット</caption> なtable要素ノードを生成します。 onclickですが、現在作成中のコードには全くありません。 基本的にはDOMで操作すればいいと考えており、長くなりがちなコードをライブラリで短くする事を目指しています。 あと2,3機能を実装すれば、公開できる形になる予定です。 おそらく1週間。順調にいけば今夜にでも公開できると思いますので、もし目にとまって魅力的に感じましたらお試しください。

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

var Question=function(){ console.info('OKWave!'); console.info('goo'); console.info('TAG index'); }; Question(); こうですか?わかりません。

think49
質問者

補足

申し訳ありません。私の言葉足らずでした。 No.1 の補足をお読みください。

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

わたしも、かじょうがきだけど、これはしつれいなこたえ?。 ねむれないよるへのはらいせか?>じぶんにね。 ほかのせんもんかのかいとうをまとう。ばぶぅ。 Question = koredeiinoka('OKWave!,goo,TAG index'); for(var i in Question) { alert(i+':'+Question[i]); } function koredeiinoka (str) { var str0 = str.split(','), str1 = str.replace(/\s+|!/g,'').toLowerCase().split(','); for(var cnt = 0, tmp, txt = []; tmp = str0[cnt];) txt[cnt] = '"'+str1[cnt++]+'":function(){console.info("'+tmp+'")}'; return (eval('var ret = {\n'+txt.join(',\n')+'\n}'),ret); }

think49
質問者

お礼

本来はお礼を書く場所ですが、他に書ける場所がないのでここで補足させてください。m(_ _)m 「既存コードに $xQuery という名前の変数定義をされていても、手軽に回避したい」という意図もあります。 jQueryがprototype.jsとのバッティングを回避できるように、$xQuery でも回避できるように対策したいのです。 現在の打開案としては /* CSV->Table要素ノード */ $xQuery.csv2tableNode = function(csv, option){ return this.array2tableNode(this.csv2array(csv, option['delimiter']), option); } のように $xQuery.**** では this.**** でメソッドを呼び出すようにして、変数名書き換えは テキストエディタで "^\$xQuery" -> "$hoge" と正規表現による一括置換で凌ぐ手段を考えています。 (必ずインデントするという構文規則があればこれで問題ない、と思います) # 他に、記述量を減らす目的なら prototypeプロパティを利用しても良い、と気が付きました。 String.prototype.csv2tableNode = function(csv, option){...} これなら変数名を気にせず宣言できる上にメソッド呼び出しの記述量が減ります。 他で同じプロパティを宣言していたら、オーバーロードしてしまうという問題は残りますが。 質問内容に沿うような答えでなく、代替案でも構いません。 あるいは、babu_babooさんが同じ状況に立った場合にどのように対策するでしょうか?

think49
質問者

補足

あ…、そういう受け取り方をされましたか。 ごめんなさい、説明が足りませんでした。 質問文ではわかりやすくするため関数内部を省略しましたが、 Question() Question.goo() Question.tagindex() はそれぞれ汎用的に使う事を前提としており、「全てが console.info(); を呼び出す」というような共通性はありません。 この順番で処理することを求めているのではなく、必要に応じて自由に呼び出せる関数として定義したいのです。 具体的には以下のようなコードです。 /* XPath->ノード (XPathを入力すると対応するノードを返す) */ // (例) // p[@title='XPathだよ!'][text()="XPathを入力してみるテスト"] // → <p title="XPathだよ!">XPathを入力してみるテスト</p> のノードを返す var $xQuery = function(x){ ... return node; }; /* CSV->配列 */ $xQuery.csv2array = function(csv, delimiter){ ... return array; }; /* 配列->table要素ノード */ $xQuery.array2tableNode = function(array, option){ ... return tableNode; }; 公開予定のJavaScriptファイルであるのでURLを掲示できればわかりやすいのですが、 規約を読むと禁止事項になっているようですので、URLを掲示できない状態です。 必要であれば、「Tag index」などURLを掲示できるコミュニティへ移動することを考えています。

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

関連するQ&A

  • jQueryの仕組みについて質問です

    お世話になります。現在jQueryのコードを読んでいるのですが、どうしてもわからないところがあります。 jQuery1.11.1の2774行目、jQuery.merge(...)と自分自身を呼び出していますが、これはjQuery中でどのような処理をして実現しているのでしょうか?jQuery.merge = function(){...};としているわけでもないのに呼び出せているのが理解できません。 mergeメソッド自体は、450行目、jQuery.extend内で定義されているようです。 以下簡易化したjQueryです。 var window = this; // ブラウザ以外で実行する場合のみ必要 (function(){ jQuery = window.jQuery = function( selector, context ) { return new jQuery.fn.init( selector, context ); }; jQuery.fn = jQuery.prototype = { hello: function(){ console.log("hello from fn!"); // ここをjQuery.logと書けるようにしたい } }; jQuery.extend = jQuery.fn.extend = function() {}; jQuery.extend({ log: function(msg){ console.log(msg); } }); init = jQuery.fn.init = function( selector, context ) { console.log("Hello"); }; init.prototype = jQuery.fn; // ここをjQuery.logと書けるようにしたい } )(); jQuery().hello();

  • jQueryでString

    jQueryでStringを扱うことはできますか? javscriptですと var str="okwave"; var v_index=str.indexOf("v"); という2行のコードをjQueryで書き換えることは可能ですか? よろしくお願いします。

  • 最後に()が付いていない内側の関数を外から呼ぶ方法

    下記状態の時、obj内容を一切変更することなく、console.log("a")を実行することは出来ない、という理解で合っているでしょうか? ・最後に()演算子がないので、内側のgoo関数を実行することが出来ない ・外側のportalで、内側のgoo関数を呼び出していれば実行できるがその記述もない この場合、gooのvarは全く意味がない? var obj = {  portal : function() {   var goo = function(){    console.log("a");   }  } } var obj = {  portal : function() {   goo = function(){    console.log("a");   }  } } ・obj.portal().goo() … × ・(obj.portal()).goo() … ×

  • js初心者 consoleなどについて

    初心者で恐縮ですが、よろしくお願いします。 jqueryを使用してます。 $(function () { obj = function(attr){ $.get('getFileList.php', {attribute : attr.data.value }, function(data){var array = data;}); }; delete obj; $("#file").on('input', {value:'file'}, obj); }); #fileに入力があったらobjが発動し$.getでphpから値を得て出力するという処理を書いています。 うまくいかないので変数arrayにちゃんと値が入っているか確認しようとしconsole.log(array)としたところjsのソースコードがconsoleにそのまま表示され、console.logを消してみてもまったく変化がなくなってしまいました。(console.log(array)したことが原因なのかは不明です。これを描いたあたりから変化がなくなっていたような気がするので。) やってみたこととしてはキャッシュの削除と.onの呼び出しの前にオブジェクトを削除することです。 ですが、やはりその変更点もconsoleに反映されてません。  初歩的かもしれませんがよろしくお願いします。

    • ベストアンサー
    • AJAX
  • 関数を呼んだら、その中の関数も自動実行される?

    ・関数の実行タイミングが分からないので教えてください ・下記で、どうして引数が渡るのでしょうか? ・portal関数を呼んだら、gooプロパティに無名関数が格納される(?)と思うのですが、=関数実行になるのでしょうか? ・無名関数だから? var obj = {  portal : function( arg ) {   var goo = function(arg){    console.log(arg);   }(arg);  } } obj.portal("あ"); ・自分的には、portal関数を呼んで変数gooに無名関数を格納(?)した後、明示的にgoo();と呼ぶ必要があると思うのですが… ・下記でTypeErrorエラーになるのは、gooプロパティが2回呼ばれるから? ・明示的に呼んだ2回目は引数が渡らないから? var obj = {  portal : function( arg ) {   var goo = function(arg){    console.log(arg);   }(arg);   goo();  } } obj.portal("あ"); //TypeError: undefined is not a function

  • JSONのプロパティ名に変数を使用したい

    JSONのプロパティ名を動的に変更したく、以下のようなコードを書いたのですが エラーでした。 var caption = "test"; var jsonSampl = { caption : "abc" }; (captionではなく、"test"というプロパティ名が欲しいのです。。) 何か方法はありますでしょうか? ※JQueryのコードで以下の"OK"部分を変数で変えたいのです。。 このプロパティがそのまま表示されるので・・。 $("<div>テスト</div>").dialog({ buttons: { "OK": function() { $(this).dialog("close"); $(this).remove(); } } }) よろしくお願いします。

  • 繰り返し処理による宣言の呼び出し

    例えば以下の様なコードの場合 subメソッドで相当な数の宣言呼び出しがされますが、 メモリ等の観点から特にパフォーマンスに影響ないでしょうか? グローバル変数等に変更し避けるべきでしょうか? また let より var の方がパフォーマンスが良いと言う観点もある様ですが、 以下はそのケースに当てはまりますでしょうか? ※動作はWEBブラウザ上を想定しています。 main(); function main(){  for(let i=0; i < 10000; i++){   sub();  } function sub(){  let hoge = new fuga();  // 以下処理 }

  • どういうときにjQueryオブジェクトが返るのか

    jQueryの初心者なのですが、どういうときにjQueryオブジェクトが返るのかよくわかりません。 var sample = $(array) のように右辺がjQueryを使っていたら、左辺にもjQueryオブジェクトが入るのでしょうか?それとも、単純なdom要素が入るのでしょうか? 自分は、前者だと思っているのですが、サンプルコードを色々とみていると、 var sample = $(window); $(sample).each(function(){ }) などのように、$()でまた変数を囲っているものも見受けられます。 果たしてどうなのでしょうか? 以上、よろしくお願い致します。

  • Javascript について質問です

    var tired=true; var bored=false; var nap = function() { if(tired || bored){ console.log("OK"); } else{ console.log("else"); } }; 上記のコードを書いた際、下記の実行結果となり、OKが表示されません。 どなたか原因が分かる方がおりましたら、教えてください。 else

  • このコードは何を使用?

    このサイトOKWaveで使われているコードですが、JQuery以外に何か使われているのでしょうか? 以下のコードです。 var lib = $.fn.okwave.lib; lib.limitDiscription = new lib.limit($('#answer')); var limit_and_show = function(){ lib.limitDiscription.length(4000); lib.limitDiscription.showNumLeft(4000, $('#num_left')); } 天才プログラマーの皆様、よろしくお願いします。