JavaScript オブジェクト志向
イベントハンドラとhtmlの分離
<body onload="init()">
<a id="evt_id" onclick="alert()">
button
</a>
↓以下のように純粋なjavascriptとhtmlに分離できる
****.js
function $(e){
return document.getElementById(e);
}
function Effect(){
$('evt_id').onclick = AlertShow();
}
function AlertShow(){
console.log("Alert!");
}
function Init(){
console.log("Hello, World!");
}
window.onload = Init();
****.html
<script type="text/javascript" src="****.js" ></script>
<a id="evt_id">
button
</a>
さらに改良
var btn = document.getElementById('btn');
var body = document.getElementsByTagName('body')[0];
if(document.addEventListener){
b.addEventListener('click', action, false);
body.addEventListener('load', init, false);
}
function init(e){
}
function action(e){
var src;
e = e || window.event;
src = e.target || e.srcElement;
src.innerHTML = 'clicked!';
}
動的に外部JavaScriptを呼び出す
DOMを操作してスマートに記述する
関数化して使い回すことができる
function callJS(url){
var e = document.createElement('script');
e.setAttribute("src", url);
document.getElementsByTagName("body").item(0).appendChild(e);
}
オブジェクト指向
DOM操作は負荷が高く時間がかかるので、コンストラクタ時点で宣言し、キャッシュを取得する。
DOM操作のイベント発火条件もこの時点で宣言しておく。
prototypeにメソッドを追加する。
//コンストラクタ
function Obj(name, id, age){
this.name = name;
this.id = id;
this.age = 20;
this.ele = document.getElementById(this.id);
}
//プロトタイプ
Obj.prototype = {
toString : function(){
this.ele.innerHTML = this.name + 'の年齢は' + this.age;
},
greed : function(){
this.ele.innerHTML = 'こんにちは!' + this.name + 'です';
}
}
function init(){
var obj1 = new Obj('reimu', 'player1', 15);
var obj2 = new Obj('marisa', 'player2', 16);
obj1.toString();
obj2.toString();
}
window.onload = function(){
init();
};
即時関数
関数を定義したすぐに関数を実行する。
(function(name, age){
console.log(name + ' is ' + age + ' years old.');
})('john', 22);
クロージャ
関数内で関数を定義し、自身が定義された環境(静的スコープ)において解決する。
以下の例では状態を保持する関数を持たせて、呼び出すたびに変更を加えている。
function counter(){
var i = 0;
return function (){
i++;
console.log(i);
}
}
var f = counter();
f();// 2
f();// 3
f();// 4