JavaScriptパターン6章 自分用まとめ2
6.9プロトタイプ継承は問題無く動く
function object(o) { function F() {}; F.prototype = o; return new F(); } function Parent() { this.vname = 'Adam'; } Parent.prototype.say = function () { return this.vname; } var papa = new Parent(); var kid = object(papa); console.log(kid.vname); // Adam console.log(kid.say()); // Adam console.log(kid.constructor.name); // Parent console.log(kid.constructor === Parent); // true
JavaScriptパターン6章 自分用まとめ
クラシカルなパターン6.7節の方法だと、プロトタイプは継承されるが、プロパティを継承出来ていない。
function inherit(C, P) {
var F = function () {};
F.prototype = P.prototype;
C.prototype = new F();
C.uber = P.prototype;
}
function Parent(vname) {
this.vname = vname || 'Adam';
}
Parent.prototype.say = function () {
return this.vname;
}
function Child() {};
inherit(Child, Parent);
var kid = new Child("Patrick");
console.log(kid.say()); // undefined
console.log(kid.constructor.name); // Parent
console.log(kid.constructor === Parent); // true
console.dir(kid);kidにvnameプロパティを追加して、say関数を読んでみることでプロトタイプの継承が出来ていることを確認する。
function inherit(C, P) {
var F = function () {};
F.prototype = P.prototype;
C.prototype = new F();
C.uber = P.prototype;
}
function Parent(vname) {
this.vname = vname || 'Adam';
}
Parent.prototype.say = function () {
return this.vname;
}
function Child() {};
inherit(Child, Parent);
var kid = new Child("Patrick");
kid.vname = "Patricks"
console.log(kid.say()); // Patrics
console.log(kid.constructor.name); // Parent
console.log(kid.constructor === Parent); // true
console.dir(kid);6.5節のようにして、コンストラクタの拝借が必要。
function inherit(C, P) {
var F = function () {};
F.prototype = P.prototype;
C.prototype = new F();
C.uber = P.prototype;
}
function Parent(vname) {
this.vname = vname || 'Adam';
}
Parent.prototype.say = function () {
return this.vname;
}
function Child(P,arg) {
var vname = [].pop.apply(arguments);
P.call(this, vname);
}
inherit(Child, Parent);
var kid = new Child(Parent,"Patrick");
//kid.vname = "Patricks"
console.log(kid.say());
console.log(kid.constructor.name);
console.log(kid.constructor === Parent);
console.dir(kid);
JavaScriptパターン3章 自分用まとめ
JavaScriptのオブジェクト作成する、リテラルの使用、コンストラクタの使用の2つの分類がある。
コンストラクタは2種類あり、独自コンストラクタ関数と、Object()、Date()、String(), Function()などの組み込みのコンストラクタがある。
リテラルを使う。
var book = {title:"JavaScript"};独自コンストラクタを使う
var Book = function(title) {
this.title = title;
};
book = new Book("JavaScript");組み込みコンストラクタはこんな風にする。
var book = new Object(); book.title = "JavaScript";
たたし、new Objectはアンチパターン。
Ojbect()コンストラクタが受け取ったパラメータの値によって、オブジェクトの作成を別の組み込みコンストラクタに委譲し、期待したオブジェクトと違う物を返すことがある。
var o = new Object(); //これだとoの__proto__はObjectになる. var n = new Object(1); //これだと、nの__proto__はNumberになる
3章のまとめは、Date()を除いて組み込みコンストラクタ関数よりリテラルの方がおすすめ。
いまいち、newの説明とコンストラクタが理解できないので調査が必要。
node.jsでXHR
node.jsでXHRを使う。expressフレームワークを使用しているので、事前にインストールが必要。
サーバと通信するときはGETメソッドを使用する。
サーバ側はGETメソッドで送られてきたデータを、req.queryで取得可能。
クライアント側(index2.html)。
<html>
<head>
<meta http-enquiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Hello, World!</title>
<script type="text/javascript" charset="utf-8">
<!--
function getXHR() {
var req;
try {
req = new XMLHttpRequest();
} catch (e) {
req = new ActiveXObject('Microsoft.XMLHTTP');
}
return req;
}
function asyncSend() {
console.log('asyncSend in');
var req = getXHR();
req.onreadystatechange = function() {
console.log('onreadychange?');
var result = document.getElementById('result');
// end communication
if (req.readyState == 4) {
console.log('readyState==4');
if (req.status == 200) {
result.innerHTML = req.responseText;
} else {
// failed to communication
result.innerHTML = "Error Happened!";
}
} else {
result.innerHTML = "connecting...";
}
}
req.open('GET','/events?name=' +
encodeURIComponent(document.fmt.name.value), true);
req.send(null);
}
-->
</script>
</head>
<body>
<form name="fmt">
<label>名前:
<input type='text' name='name' size=15 />
</label>
<input type='button' name='submit' value="送信" onclick="asyncSend()" />
</form>
<div id="result"></div>
</body>
</html>サーバ側
var express = require('express'); var app = express.createServer(); app.use(express.bodyDecoder()); app.get('/', function(req, res) { res.sendfile('index2.html'); }); app.get('/events', function(req, res) { console.log('get /events'); res.writeHead(200, { 'Content-Type' : 'text/plain', 'Access-Control-Allow-Origin' : '*' }); var name = null; if (req.query.name) { name = req.query.name; } else { name = '名無し'; } res.write('Hello! ' + name, 'utf8'); res.end(); }); app.post('/', function(req, res) { }); app.listen(8124, '127.0.0.1');
仮想化
仮想化ソフトの種類
・ホストOS型
VMWare WorkStation, VMWare Fusion, Virtual PC
ネットワーク機能
1.ブリッジ
ホストマシンが接続された物理ネットワークに、仮想マシンを直接つないだように動作する。
物理マシンのNICを経由するが、外部から仮想マシンのIPに直接アクセス可能
2.NAT
仮想マシンの仮想ネットワークアドレスを、ホストマシンが接続された物理ネットワークアドレスに変換して、動作する。
ホストマシンには、仮想ネットワークに接続するための仮想NICが追加され、アドレス変換機能を持つ。
3.ホストオンリー
仮想マシン同士のみ通信可能。
・ハイパーバイザ型
VMWare ESX, Hyper-V, XenServer
ネットワーク機能
仮想スイッチ or ソフトウェアスイッチ 形式
これは、VLANに対応したL2スイッチ と同様の動きをする。
ソフトウェアの違い(ESX vs Xen,Hyper-V)
ESX
仮想マシンはハイパーバイザで動作するデバイス・ドライバを通してNICなどのハードウェアにアクセスする。
Xen,Hyper-V
管理用の仮想マシン(管理OS)を必ず一つかどうさせ、そこでデバイス・ドライバを動かす。
他の仮想マシンは、このドライバを通してNICなどのハードウェアにアクセスする。
ゲストOSの種類
・準仮想化
ゲストOSに手を加える・・・古いLinuxなど使えない場合あり
手を加えた部分は直接、仮想化レイヤーに処理を依頼する分、負荷が低い
準仮想化によって効率的に高速化できるI/FをVMIとして公開されている。
・完全仮想化
ゲストOSに手を加えない
仮想化レイヤーによって作られた、仮想ハードウェアを通してすべてを処理する。
準仮想化に比べると遅い