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

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

babu_babooの回答

回答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')); } 天才プログラマーの皆様、よろしくお願いします。