<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Class &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/class/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Mon, 02 Dec 2013 01:32:28 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>&#034;Class&#034; &#8211; Alphabetical Advent Calendar 2013</title>
		<link>https://blog.mach3.jp/2013/12/02/jaac2013-c-class.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 02 Dec 2013 01:32:28 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Advent Calendar 2013]]></category>
		<category><![CDATA[Class]]></category>
		<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3631</guid>

					<description><![CDATA[&#8220;C&#8221; は Class の &#8220;C&#8221;。 レガシーなJavaScriptのクラス JavaScriptでクラスと言っても、現行のバージョンではclass構文が実装されていない為 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>&#8220;C&#8221; は Class の &#8220;C&#8221;。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-E1LiTz6Bnyo/UqR4fkL_-fI/AAAAAAAACYg/03ZbsI7LSyI/s400/ac2013-c.png" alt="C"/></figure>



<p></p>



<span id="more-3631"></span>



<h2 class="wp-block-heading">レガシーなJavaScriptのクラス</h2>



<p>JavaScriptでクラスと言っても、現行のバージョンではclass構文が実装されていない為、 クラスを使いたい場合はレガシーな方法をとるか、フレームワークの機能やクラスライブラリを使ってクラスを定義する事になります。</p>



<p>今回は生のJavaScriptでレガシーなクラス（のようなもの）を書いてみる事とします。</p>



<h3 class="wp-block-heading">プロトタイプを利用するタイプ</h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// コンストラクタ</span>
<span class="hljs-keyword">var</span> Person = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">name, age</span>)</span>{
    <span class="hljs-keyword">this</span>.name = name;
    <span class="hljs-keyword">this</span>.age = age;
};
<span class="hljs-comment">// 属性の定義</span>
(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">my</span>)</span>{
    my.name = <span class="hljs-literal">null</span>;
    my.age = <span class="hljs-literal">null</span>;
    my.hello = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">return</span> <span class="hljs-string">"こんにちは、{{name}}です。{{age}}歳です。"</span>
            .replace(<span class="hljs-string">"{{name}}"</span>, <span class="hljs-keyword">this</span>.name)
            .replace(<span class="hljs-string">"{{age}}"</span>, <span class="hljs-keyword">this</span>.age);
    };
}(Person.prototype));

<span class="hljs-keyword">var</span> john = <span class="hljs-keyword">new</span> Person(<span class="hljs-string">"ジョン・カビラ"</span>, <span class="hljs-number">54</span>);
john.hello(); <span class="hljs-comment">// "こんにちは、ジョン・カビラです。54歳です。"</span>
</code></span></pre>


<p>function の prototype に属性を生やしていき、new でインスタンスを生成します。 生成されたオブジェクトは、 prototype の中身を全て継承します。 人によって書き方や趣向がかなり異なる印象です。 jQuery等を読み込んであるならば、extendを利用しても見易くて良いかもしれません。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$.extend(<span class="hljs-literal">true</span>, Person.prototype, {
    <span class="hljs-attr">name</span>: <span class="hljs-literal">null</span>,
    <span class="hljs-attr">age</span>: <span class="hljs-literal">null</span>,
    <span class="hljs-attr">hello</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{ ... }
});
</code></span></pre>


<p>同じく $.extend で他のクラスの継承も出来ますね。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$.extend(Person.prototype, Animal.prototype);
</code></span></pre>


<h3 class="wp-block-heading">コンストラクタ内だけで完結するタイプ</h3>



<p>関数型などと呼ばれているのを聞いた事があります。 前項の物と大きく異るのが、プロトタイプからの継承ができない点でしょうか。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> Person = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">name, age</span>)</span>{
    <span class="hljs-keyword">this</span>.name = name;
    <span class="hljs-keyword">this</span>.age = age;
    <span class="hljs-keyword">this</span>.hello = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">return</span> <span class="hljs-string">"こんにちは、{{name}}です。{{age}}歳です。"</span>
            .replace(<span class="hljs-string">"{{name}}"</span>, <span class="hljs-keyword">this</span>.name)
            .replace(<span class="hljs-string">"{{age}}"</span>, <span class="hljs-keyword">this</span>.age);
    };
};
</code></span></pre>


<p>非常に狭いスポットで使用したい場合などはお手軽で良いのかもしれませんが、 prototype を継承して新しいインスタンスを生成するのが new 演算子の本分だと思うので、 基本的にはそれに則った形をとったほうが良いかな、と考えています。</p>



<h2 class="wp-block-heading">レガシーではない選択肢</h2>



<p>昨今では新しい実装やリソースも沢山増えてきたので、選択肢が幅広くあります。</p>



<h3 class="wp-block-heading">altJSを使う</h3>



<p>ここ数年で一気に盛り上がってきた <a href="http://altjs.org">altJS</a> はおそらくどれもクラスが実装されているはずなので、それを利用する選択肢。 ポピュラーなのは <a href="http://coffeescript.org/">CoffeeScript</a>、<a href="http://www.typescriptlang.org/">TypeScript</a>、<a href="http://haxe.org/">Haxe</a>、<a href="http://jsx.github.io/">JSX</a> 等。 ネックは、いずれも大なり小なりJavaScriptから離れた構文になる為、学習コストがかかる点です。</p>



<p>例えば、Haxeでクラスを定義するとこんな具合になる様です。 ActionScript3（EcmaScript4）にかなり近い構文になっているので親しみを感じる人もいるかもしれませんね。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Person</span> </span>{
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">var</span> name:String;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">var</span> age:Int;
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">new</span><span class="hljs-params">(name, age)</span></span>{
        this.name = name;
        this.age = age;
    }
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-params">()</span></span>{ ... }
}
</code></span></pre>


<h3 class="wp-block-heading">フレームワークを使う</h3>



<p>最近一番耳にするのは <a href="http://backbonejs.org/">Backbone.js</a> です。</p>



<p>Backbone には Model や View　などの基底クラスが実装されていて、 それを継承して独自のクラスを定義していきます。 例えば Model であれば、ゲッターセッターや Ajax まわりの機能が既に盛り込まれているので、 それらを覚えさえすれば非常に効率的にアプリケーションを制作できるでしょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> Person = Backbone.Model.extend({
    <span class="hljs-attr">defaults</span>: {
        <span class="hljs-attr">name</span>: <span class="hljs-literal">null</span>,
        <span class="hljs-attr">age</span>: <span class="hljs-literal">null</span>
    },
    <span class="hljs-attr">initialize</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">name, age</span>)</span>{
        <span class="hljs-keyword">this</span>.set({ <span class="hljs-attr">name</span>: name, <span class="hljs-attr">age</span>: age });
    },
    <span class="hljs-attr">hello</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{ ... }
});

<span class="hljs-keyword">var</span> person = <span class="hljs-keyword">new</span> Person(<span class="hljs-string">"John"</span>, <span class="hljs-number">54</span>);
</code></span></pre>


<h2 class="wp-block-heading">参考資料</h2>



<ul class="wp-block-list">
<li><a href="http://api.jquery.com/jQuery.extend/">jQuery.extend() | jQuery API Documentation</a></li>



<li><a href="https://github.com/jashkenas/coffee-script/wiki/List-of-languages-that-compile-to-JS">List of languages that compile to JS · jashkenas/coffee-script Wiki</a></li>



<li><a href="http://haxe.org/">index &#8211; Haxe</a></li>



<li><a href="http://backbonejs.org/">Backbone.js</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>jQuery.class.jsをアップデートしました</title>
		<link>https://blog.mach3.jp/2012/02/01/jquery-class-js-1-2.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Wed, 01 Feb 2012 00:51:58 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Class]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jQuery.class.js]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Prototype.js]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2274</guid>

					<description><![CDATA[ちょっと使う予定が出来たのもあり、jQuery.class.jsの内容を見直してみました。 jQuery.class.js Prototype.jsライクなclassを生成する為のシンプルなライブラリ。 cf ) jQu [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>ちょっと使う予定が出来たのもあり、jQuery.class.jsの内容を見直してみました。</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh6.ggpht.com/_JJkNs5Ixl70/TKHxrRN3cwI/AAAAAAAABC4/YrmxwaVzbLQ/201009282244.png" alt="jQuery.class.jsをアップデートしました"/></figure>



<p></p>



<span id="more-2274"></span>



<h2 class="wp-block-heading">jQuery.class.js</h2>



<ul class="wp-block-list">
<li><a href="https://github.com/mach3/js-jquery-class">mach3/js-jquery-class &#8211; GitHub</a></li>
</ul>



<p>Prototype.jsライクなclassを生成する為のシンプルなライブラリ。<br />
cf ) <a href="https://blog.mach3.jp/2010/09/jquery-class-js.html">jQueryでPrototype.js風のクラス定義をしてみる | Mach3.laBlog</a></p>



<h2 class="wp-block-heading">更新内容</h2>



<ul class="wp-block-list">
<li>jQuery.on/off()でイベントを扱えるようにしました</li>
</ul>



<p>これだけです。<br />
jQuery 1.7+ で使えるようになったon/off()メソッドに対応しました。<br />
従来通りbind/unbindも使えます。<br />
また、あわせて例示を大きく改めました</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> Data = Class.create();
Data.prototype = {
    <span class="hljs-attr">EVENT_ITEM_ADDED</span> : <span class="hljs-string">"item_added"</span>,
    <span class="hljs-attr">items</span> : &#91;],
    <span class="hljs-attr">addItem</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
       <span class="hljs-keyword">for</span>(i <span class="hljs-keyword">in</span> <span class="hljs-built_in">arguments</span>){
          <span class="hljs-keyword">this</span>.items.push(<span class="hljs-built_in">arguments</span>&#91;i]);
       }
       <span class="hljs-keyword">this</span>.trigger(<span class="hljs-keyword">this</span>.EVENT_ITEM_ADDED);
    },
    <span class="hljs-attr">getItemCount</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
       <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.items.length;
    }
};

<span class="hljs-keyword">var</span> myData = <span class="hljs-keyword">new</span> Data();
<span class="hljs-keyword">var</span> onAdded = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Items added. I have "</span> + <span class="hljs-keyword">this</span>.getItemCount() + <span class="hljs-string">" items now."</span>);
};

<span class="hljs-comment">/**
 * on()でイベントリスナの追加
 * bind()でも可
 */</span>
myData.on(myData.EVENT_ITEM_ADDED, onAdded);
myData.addItem(<span class="hljs-string">"hoge"</span>); <span class="hljs-comment">// =&gt; Items added. I have 1 items now.</span>
myData.addItem(<span class="hljs-string">"fuga"</span>,<span class="hljs-string">"foo"</span>,<span class="hljs-string">"bar"</span>); <span class="hljs-comment">// =&gt; Items added. I have 4 items now.</span>

<span class="hljs-comment">/**
 * off()でイベントリスナの解除
 * unbind()でも可
 */</span>
myData.off(myData.EVENT_ITEM_ADDED, onAdded);
myData.addItem(<span class="hljs-string">"piyo"</span>); <span class="hljs-comment">// (nothing occurs)</span>
</code></span></pre>


<p>また、少し自分でまともに運用してみて、欲しいメソッドがあれば新たに生やすかもしれません。<br />
何かありましたらどうぞ。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>JavaScriptでHashChangeのシンプルなクラスを書いてみる</title>
		<link>https://blog.mach3.jp/2011/09/26/js-hashchange-class.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 26 Sep 2011 02:14:20 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Class]]></category>
		<category><![CDATA[HashChange]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[location.hash]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2016</guid>

					<description><![CDATA[以前に紹介したSammy.jsのサイトを見に行ったら、 何やら色々とバージョンアップしてフレームワーク的な物に生まれ変わっていました。 もうちょっとシンプルな物が欲しい場合もあるので、エクササイズを兼ねて書いてみました。 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>以前に紹介した<a href="http://sammyjs.org">Sammy.js</a>のサイトを見に行ったら、<br />
何やら色々とバージョンアップしてフレームワーク的な物に生まれ変わっていました。<br />
もうちょっとシンプルな物が欲しい場合もあるので、エクササイズを兼ねて書いてみました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/--BUJ4-y9pmA/TnramMbrmQI/AAAAAAAABXM/i3orJbmJPao/201109221549.png" alt="HashChangeのシンプルなクラスを書いてみる"/></figure>



<p></p>



<span id="more-2016"></span>



<h2 class="wp-block-heading">HashChangeとは</h2>



<p>たとえば、いわゆるページ内リンクで</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>http://www.example.com/</p>
</blockquote>



<p>から</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>http://www.example.com/#foobar</p>
</blockquote>



<p>にURLが変わったタイミングにイベントを受け取って<br />
なんやかんやする為のもの。</p>



<p>わりと有名だと思われるのが、jQuery hashchange eventプラグインですね。<br />
» <a href="http://benalman.com/projects/jquery-hashchange-plugin/">Ben Alman » jQuery hashchange event</a></p>



<p>あとは、冒頭で言ったSammy.js。こちらもjQueryプラグインです。<br />
» <a href="http://sammyjs.org/">Sammy.js / A Small Web Framework with Class / RESTFul Evented JavaScript</a></p>



<h2 class="wp-block-heading">車輪の再発明です</h2>



<p>本稿は車輪の再発明です。<br />
日々変わりゆく自分のJSの書き方をログっておくのに丁度良い題材な気がしたので。</p>



<p>特にクラスの書き方なんかはなかなか定まらず、ふらふらしてます。<br />
近いうちにそこら辺もまとめておきたい物です。</p>



<h2 class="wp-block-heading">書いたもの</h2>



<p>» <a href="https://gist.github.com/1219138">location.hashの変更イベントを受け取るためのもの。 — Gist</a></p>



<p>今回は敢えてjQueryから切り離した作りにしてみた。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">/*!
 * HashChange.js
 * <span class="hljs-doctag">@version</span> 1.0
 * <span class="hljs-doctag">@author</span> mach3
 * <span class="hljs-doctag">@example</span>
 * var foo = new HashChange();
 * foo.config({ onInit:myInitFunc, onChange:myChangeFunc, interval:100 });
 * foo.start(); // When start to observe.
 * foo.stop(); // When stop to observe.
 */</span>

<span class="hljs-comment">/**
 * Creates a new HashChange.
 * <span class="hljs-doctag">@constructor</span>
 * <span class="hljs-doctag">@class</span> observe changes of locatin.hash.
 * <span class="hljs-doctag">@param</span> {Object} options Configuration options.
 */</span>
<span class="hljs-keyword">var</span> HashChange = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">( options )</span></span>{

    <span class="hljs-keyword">var</span> my, vars, methods ;

    my = this;
    vars = {
        onChange : <span class="hljs-keyword">null</span>,
        onInit : <span class="hljs-keyword">null</span>,
        interval : <span class="hljs-number">100</span>,
        timer : <span class="hljs-keyword">null</span>,
        hash : <span class="hljs-keyword">null</span>
    };
    methods = {
        isFunction : <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">( target )</span></span>{
            <span class="hljs-keyword">return</span> typeof( target ) === <span class="hljs-string">"function"</span> ;
        }
    };

    <span class="hljs-comment">/**
     * Configure options.
     * <span class="hljs-doctag">@param</span> {Object} options Configuration options.
     */</span>
    my.config = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">( options )</span></span>{
        <span class="hljs-keyword">for</span>( i in options ){
            <span class="hljs-keyword">if</span>( !vars.hasOwnProperty( i ) ){ <span class="hljs-keyword">continue</span>; }
            vars&#91;i] = options&#91;i];
        }
    };
    <span class="hljs-comment">/**
     * Start to observe.
     */</span>
    my.start = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span></span>{
        my.run();
    };
    <span class="hljs-comment">/**
     * Check whether location.hash has been changed or not,
     * call onInit/onChange function if set,
     * and call itself by timeout again.
     */</span>
    my.run = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span></span>{
        <span class="hljs-keyword">var</span> h = location.hash;
        <span class="hljs-keyword">if</span>( vars.hash === <span class="hljs-keyword">null</span> &amp;&amp; methods.isFunction( vars.onInit ) ){
            vars.onInit( h );
        } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> ( vars.hash !== h &amp;&amp; methods.isFunction( vars.onChange ) ){
            vars.onChange( h );
        }
        vars.hash = location.hash;
        vars.timer = setTimeout( my.run, vars.interval );
    };
    <span class="hljs-comment">/**
     * Stop to observe.
     */</span>
    my.stop = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span></span>{
        clearTimeout( vars.timer );
    };

    my.config( options );
};
</code></span></pre>


<h2 class="wp-block-heading">使い方</h2>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> myHashChange = <span class="hljs-keyword">new</span> HashChange();
myHashChange.config({
    <span class="hljs-attr">onInit</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> hash </span>)</span>{
        <span class="hljs-built_in">console</span>.log( <span class="hljs-string">"Initialize : "</span> + hash );
    },
    <span class="hljs-attr">onChange</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> hash </span>)</span>{
        <span class="hljs-built_in">console</span>.log( <span class="hljs-string">"Change : "</span> + hash );
    }
});
myHashChange.start();
</code></span></pre>


<p>config() でイベントリスナを含めたオプションを設定して、<br />
start() すればlocation.hashの監視を始めます。<br />
監視を停止したい時はstop()で。</p>



<p>尚、コンストラクタでもオプション受け取れます。</p>



<h3 class="wp-block-heading">オプション</h3>



<dl>
<dt>onInit</dt>
<dd>初期化時のイベントリスナ</dd>
<dt>onChange</dt>
<dd>location.hashが変更された時のイベントリスナ</dd>
<dt>interval</dt>
<dd>監視用タイマーのインターバル。デフォルトは100ミリ秒。</dd>
</dl>



<h2 class="wp-block-heading">まとめ</h2>



<p>やっぱりjQueryプラグイン！っていう感じの書き方より、<br />
クラスベースっぽく書くのが好みみたいです。</p>



<p>ちょっとだけ、Prototype.jsに戻りたくなってきていたり。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>どう書いていますか？JavaScriptのクラス</title>
		<link>https://blog.mach3.jp/2011/01/11/class-for-javascript.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 11 Jan 2011 02:11:08 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Class]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Tips]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=1375</guid>

					<description><![CDATA[JavaScriptでのクラスの話は定期的に書いているネタな気がしますが、 自分でもなかなかスタイルが定まらないので、ちょっとメモなど。 基本的な形 プラグインとか書いた事もありましたが、 結局今は、こんなオーソドックス [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>JavaScriptでのクラスの話は定期的に書いているネタな気がしますが、<br />
自分でもなかなかスタイルが定まらないので、ちょっとメモなど。</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh5.ggpht.com/_JJkNs5Ixl70/TSs4NcUMq2I/AAAAAAAABJM/i5baOC0RKck/201101110145.png" alt="どう書いていますか？JavaScriptのクラス"/></figure>



<p></p>



<span id="more-1375"></span>



<h2 class="wp-block-heading">基本的な形</h2>



<p><a href="/2010/09/jquery-class-js.html">プラグインとか書いた</a>事もありましたが、<br />
結局今は、こんなオーソドックスな形に収まっています。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> Person = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> name </span>)</span>{
    <span class="hljs-comment">/* コンストラクタ */</span>
    <span class="hljs-keyword">this</span>.name = name;
};
Person.prototype = {
    <span class="hljs-attr">name</span> : <span class="hljs-literal">null</span>,
    <span class="hljs-attr">sayHello</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-built_in">console</span>.log( <span class="hljs-string">"こんにちは！"</span> + <span class="hljs-keyword">this</span>.name + <span class="hljs-string">"です！"</span> );
    }
};
<span class="hljs-keyword">var</span> john = <span class="hljs-keyword">new</span> Person( <span class="hljs-string">"まっは"</span> );
john.sayHello(); <span class="hljs-comment">// "こんにちは！まっはです！"</span>
</code></span></pre>


<h2 class="wp-block-heading">プロパティにオブジェクトを使う</h2>



<p>オブジェクトに設定値をまとめてコンストラクタに引数で渡して～っていうのは結構頻出ですが、<br />
プロパティにオブジェクトを使いつつ、インスタンスを複数作りたい場合は注意が必要。<br />
普通に書いてしまうと、どのインスタンスもprototypeのメンバを参照してしまい、<br />
或るインスタンスで値を変えると、他のインスタンスでも変わってしまうという困った事になります。</p>



<p>こちらの記事がわかりやすかったです。</p>



<ul class="wp-block-list">
<li><a href="http://zudolab.net/blog/?p=536">zudolog » prototypeでメンバにオブジェクト指定してるとハマるかも</a></li>
</ul>



<p>そこで、上の記事を参考にこんな感じ書いておきます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> Person = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> option </span>)</span>{
    <span class="hljs-keyword">this</span>.option = $.extend( {}, <span class="hljs-keyword">this</span>.option ); <span class="hljs-comment">// 重要！</span>
    <span class="hljs-keyword">this</span>.setOption( option );
};
</code></span></pre>


<p>コンストラクタ一行目、optionを空のオブジェクトに格納しなおして代入しています。<br />
こうすることで、インスタンス毎に別のオブジェクトを扱えるという寸法。なるほどなるほど。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">Person.prototype = {
    <span class="hljs-attr">option</span> : {
        <span class="hljs-attr">name</span> : <span class="hljs-literal">null</span>,
        <span class="hljs-attr">age</span> : <span class="hljs-literal">null</span>
    },
    <span class="hljs-attr">setOption</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> option </span>)</span>{
        $.extend( <span class="hljs-keyword">this</span>.option, option );
    },
    <span class="hljs-attr">sayHello</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-built_in">console</span>.log(
            <span class="hljs-string">"こんにちは！"</span> + <span class="hljs-keyword">this</span>.option.name + <span class="hljs-string">"です！"</span> +
            <span class="hljs-string">"永遠の"</span> + <span class="hljs-keyword">this</span>.option.age + <span class="hljs-string">"歳です！"</span>
        );
    }
};

<span class="hljs-keyword">var</span> john = <span class="hljs-keyword">new</span> Person( { <span class="hljs-attr">name</span> : <span class="hljs-string">"ジョン"</span>, <span class="hljs-attr">age</span> : <span class="hljs-number">29</span> } ),
    tom = <span class="hljs-keyword">new</span> Person( { <span class="hljs-attr">name</span> : <span class="hljs-string">"トム"</span>, <span class="hljs-attr">age</span> : <span class="hljs-number">16</span> } );

john.sayHello(); <span class="hljs-comment">// "こんにちは！ジョンです！永遠の29歳です！"</span>
tom.sayHello(); <span class="hljs-comment">// "こんにちは！トムです！永遠の16歳です！"</span>
</code></span></pre>


<p>コンストラクタの一行目の処理がない場合、<br />
上の出力結果はどちらもトム16歳になってしまいます。</p>



<h2 class="wp-block-heading">カスタムイベントを使う</h2>



<p>AS3のdispatchEventみたくカスタムイベントを利用してみます。<br />
<a href="/2010/07/jquery-trigger-eventdispatcher.html">同じ内容を確か以前書きました</a>が、まとめの為、一応。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> Items = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> data </span>)</span>{
    <span class="hljs-keyword">this</span>.data = $.extend( &#91;], <span class="hljs-keyword">this</span>.data, data );
};
Items.prototype = {
    <span class="hljs-attr">EVENT_ADDED</span> : <span class="hljs-string">"added"</span>,
    <span class="hljs-attr">data</span> : &#91;],
    <span class="hljs-attr">add</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> value </span>)</span>{
        <span class="hljs-keyword">this</span>.data.push( value );
        $(<span class="hljs-keyword">this</span>).trigger( <span class="hljs-keyword">this</span>.EVENT_ADDED );
    },
    <span class="hljs-attr">bind</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> type, handler </span>)</span>{
        $(<span class="hljs-keyword">this</span>).bind( type, handler );
    }
};
</code></span></pre>


<p>といっても、自身を格納したjQueryオブジェクトからbind/triggerを呼び出してるだけですが…。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> MyItems = <span class="hljs-keyword">new</span> Items;
MyItems.bind( MyItems.EVENT_ADDED, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-built_in">console</span>.log( <span class="hljs-keyword">this</span>.data );
});

MyItems.add( <span class="hljs-string">"foobar"</span> ); <span class="hljs-comment">// &#91;"foobar"]</span>
</code></span></pre>


<p>イベントリスナの登録はbindを使います。<br />
addメソッドで値を追加すると、&#8221;added&#8221;イベントに着火される仕組み。</p>



<p>あまり頻繁に使う事もない気がしますが。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>と、こんな感じで書いておりますが、<br />
他の方がどのように書いているのかも知りたいところですね！</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>jQuery.class.jsのバグ修正とconsole.logのお話</title>
		<link>https://blog.mach3.jp/2010/11/12/jquery-class-js-bugfix.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Fri, 12 Nov 2010 10:27:47 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Class]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Plugin]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=1102</guid>

					<description><![CDATA[jQueryでPrototype.js風のクラス定義をしてみる で公開していたスクリプトで見つかった不具合が、意外と盲点だったので自戒として記録。 ただ単純にチェック不足なだけでしたが…悔しい。 ソース mach3&#8 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><a href="/2010/09/jquery-class-js.html">jQueryでPrototype.js風のクラス定義をしてみる</a><br />
で公開していたスクリプトで見つかった不具合が、意外と盲点だったので自戒として記録。<br />
ただ単純にチェック不足なだけでしたが…悔しい。</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh6.ggpht.com/_JJkNs5Ixl70/TKHxrRN3cwI/AAAAAAAABC4/YrmxwaVzbLQ/201009282244.png" alt="jQury.class.js"/></figure>



<p></p>



<span id="more-1102"></span>



<h2 class="wp-block-heading">ソース</h2>



<p><a href="https://github.com/mach3/js-jquery-class">mach3&#8217;s js-jquery-class at master &#8211; GitHub</a></p>



<h2 class="wp-block-heading">あるの？ないの？console.log</h2>



<p>引っかかったのは、インスタンスにlogメソッドを生やしている部分。<br />
console.logの有無で分岐をした…つもりだったんですが、</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">if</span>( $.isFunction( <span class="hljs-built_in">console</span>.log ) ){ ... }
</code></span></pre>


<p>当たり前なのですが、<br />
console.logが、というかconsoleがなければここで処理は止まってしまいます…。<br />
なんでこんなのに気付かなかったのかというと、IE8で処理が止まらなかったから。<br />
なぜなら、consoleもconsole.logも有るから！（実は知らなかったーー！！）</p>



<p>そんなわけで、条件を修正。<br />
なんかもうちょっとスマートに書きたいですが…</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">typeof</span>(<span class="hljs-built_in">console</span>)!==<span class="hljs-string">"undefined"</span> &amp;&amp; <span class="hljs-keyword">typeof</span>(<span class="hljs-built_in">console</span>.log)!==<span class="hljs-string">"undefined"</span>
</code></span></pre>


<p>IE8の開発者ツールをちゃんと使って無かったって事ですね。反省。<br />
でも次からは楽になりますね！</p>



<h2 class="wp-block-heading">追記 : 2013/10/13</h2>



<p>実は、これでいいですよね。</p>


<pre class="wp-block-code"><span><code class="hljs language-css">!! <span class="hljs-selector-tag">window</span><span class="hljs-selector-class">.console</span> &amp;&amp; !! <span class="hljs-selector-tag">window</span><span class="hljs-selector-class">.console</span><span class="hljs-selector-class">.log</span>
</code></span></pre>


<p>この不具合、特別必要なかったオマケ機能だった事もあって、結構悔しいです…</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>jQueryでPrototype.js風のクラス定義をしてみる</title>
		<link>https://blog.mach3.jp/2010/09/29/jquery-class-js.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Wed, 29 Sep 2010 05:28:48 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Class]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Prototype.js]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=778</guid>

					<description><![CDATA[Prototype.jsを使っていた時によく愛用していたのが、Class.create()というメソッド。 クラス定義がオブジェクトリテラルで簡単に書けるようになる機能ですが、 今回はそれと似たようなjQueryプラグイ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Prototype.jsを使っていた時によく愛用していたのが、<em>Class.create()</em>というメソッド。<br />
クラス定義がオブジェクトリテラルで簡単に書けるようになる機能ですが、<br />
今回はそれと似たようなjQueryプラグインを書いてみました。</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh6.ggpht.com/_JJkNs5Ixl70/TKHxrRN3cwI/AAAAAAAABC4/YrmxwaVzbLQ/201009282244.png" alt="Class.create on jQuery"/></figure>



<p></p>



<span id="more-778"></span>



<h2 class="wp-block-heading">jquery.class.js</h2>



<p><a href="http://github.com/mach3/js-jquery-class">mach3&#8217;s js-jquery-class at master &#8211; GitHub</a></p>



<p>※Prototype.jsをモデルにしていますが、実装を複製したものではありません。<br />
ですので、本家とは細かい部分で実装が異なり、本家同様に動くわけではありません。</p>



<h2 class="wp-block-heading">伝統的なPrototype.jsライクな使い方（Class.create）</h2>



<p>基本的な定義の仕方は本家のそれに則っています。<br />
cf) <a href="http://prototypejs.org/learn/class-inheritance">Prototype JavaScript framework: Defining classes and inheritance</a></p>



<h3 class="wp-block-heading">クラス定義</h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> Human = Class.create();
Human.prototype = {
    <span class="hljs-attr">name</span>:<span class="hljs-literal">null</span>,
    <span class="hljs-attr">age</span>:<span class="hljs-literal">null</span>,
    <span class="hljs-attr">initialize</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> name, age </span>)</span>{
        <span class="hljs-keyword">this</span>.name = name;
        <span class="hljs-keyword">this</span>.age = age;
    },
    <span class="hljs-attr">introduce</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        alert(<span class="hljs-string">"私の名前は"</span> + <span class="hljs-keyword">this</span>.name + <span class="hljs-string">"、"</span> + <span class="hljs-keyword">this</span>.age + <span class="hljs-string">"歳です"</span>);
    }
};
<span class="hljs-keyword">var</span> mach3 = <span class="hljs-keyword">new</span> Human(<span class="hljs-string">"まっは"</span>, <span class="hljs-number">3</span>);
mach3.introduce();
</code></span></pre>


<p>Class.create()が渡されたオブジェクトは、<br />
インスタンス生成時にinitializeメソッドを実行するようになります。<br />
勿論、引数も渡せます。</p>



<h3 class="wp-block-heading">継承</h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> Animal = Class.create();
Animal.prototype = {
    <span class="hljs-attr">walk</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        alert(<span class="hljs-string">"てくてく"</span>);
    },
    <span class="hljs-attr">eat</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        alert(<span class="hljs-string">"もぐもぐ"</span>);
    }
};
<span class="hljs-keyword">var</span> Dog = Class.create( Animal );
Dog.prototype = {
    <span class="hljs-attr">bark</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        alert(<span class="hljs-string">"ワンワン"</span>);
    }
};
</code></span></pre>


<p>Class.create()の引数にクラスオブジェクトを渡す事で、<br />
それを親とする派生クラスを定義する事が出来ます。</p>



<h2 class="wp-block-heading">よりコンパクトな使い方（Class.get）</h2>



<p>こちらの書き方は、本家の物とは違うのでご注意を。<br />
引数だけで完結できる<em>Class.get()</em>とやらを実装してみました。</p>



<h3 class="wp-block-heading">クラス定義</h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> Human = Class.get({
    <span class="hljs-attr">name</span>:<span class="hljs-literal">null</span>,
    <span class="hljs-attr">age</span>:<span class="hljs-literal">null</span>,
    <span class="hljs-attr">initialize</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> name, age </span>)</span>{
        <span class="hljs-keyword">this</span>.name = name;
        <span class="hljs-keyword">this</span>.age = age;
    },
    <span class="hljs-attr">introduce</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        alert(<span class="hljs-string">"私の名前は"</span> + <span class="hljs-keyword">this</span>.name + <span class="hljs-string">"、"</span> + <span class="hljs-keyword">this</span>.age + <span class="hljs-string">"歳です"</span>);
    }
});
</code></span></pre>


<p>prototypeを定義しなくて良い分、少しだけコンパクトに。</p>



<h3 class="wp-block-heading">継承</h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> Dog = Class.get({
    <span class="hljs-attr">bark</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        alert(<span class="hljs-string">"ワンワン"</span>);
    }
}, Animal );
</code></span></pre>


<p>第二引数にクラスオブジェクトを渡せば継承が出来ます。</p>



<h2 class="wp-block-heading">イベント管理（bind/trigger）</h2>



<p>イベントの管理にはjQueryの<em>bind/trigger</em>を利用します。<br />
生成されたクラスインスタンスにはbind/triggerメソッドを備えてありますので、<br />
$(this)等して別途用意しなくても呼び出す事が出来ます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> Data = Class.get({
    <span class="hljs-attr">ITEM_ADDED</span>:<span class="hljs-string">"item_added"</span>, <span class="hljs-comment">//イベント名の定義</span>
    <span class="hljs-attr">items</span>:&#91;],
    <span class="hljs-attr">addItem</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> item </span>)</span>{
        <span class="hljs-keyword">this</span>.items.push( item );
        <span class="hljs-keyword">this</span>.trigger( <span class="hljs-keyword">this</span>.ITEM_ADDED ); <span class="hljs-comment">//イベント着火</span>
    },
    <span class="hljs-attr">getItemCount</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.items.length;
    }
});

<span class="hljs-keyword">var</span> myData = <span class="hljs-keyword">new</span> Data();
<span class="hljs-comment">// bindでイベントリスナーの追加</span>
myData.bind( myData.ITEM_ADDED, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
    alert(<span class="hljs-string">"ItemsCount : "</span> + <span class="hljs-keyword">this</span>.getItemCount() );
});
myData.addItem( <span class="hljs-string">"hoge"</span> );
</code></span></pre>


<h2 class="wp-block-heading">おまけ機能</h2>



<p>bind/triggerのついでですが、<br />
各ブラウザの開発者ツールのコンソールに出力する<em>console.log()</em>のラッパーも<br />
<em>log()</em>として実装してみました。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> MyClass = Class.get({
    <span class="hljs-attr">initialize</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">this</span>.log(<span class="hljs-string">"Initialized !"</span>); <span class="hljs-comment">//Firebugのコンソールに出力</span>
    }
});
</code></span></pre>


<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>自分用に作ったので当たり前ですが、個人的には大変使いやすいです。<br />
色々ヒントをいただいた<a href="http://twitter.com/ginpei_jp">ginpei_jp</a>氏、<a href="http://twitter.com/nicerice">nicerice</a>さん、<br />
この場を借りて、どうもありがとう！</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
