Javascript 第5版 第9章
2010/02/08(月) 22:39 Javascript

9.2 プロトタイプと継承

すべての関数は定義時に自動的にprototypeプロパティが生成され、値が設定される。
この時の初期値はconstructorプロパティのみである。

9.2.2 組み込み型の拡張

まずはobjのプロパティにdが存在するかを見る→もしなかったらprototypeを辿りそこにプロパティが存在するかを見る。
function obj();
obj.c = "テニス";
obj.prototype.d = "tennis";
console.log(obj.c);// テニス
console.log(obj.d);// エラー
var obj2 = new obj();
console.log(obj2.c);// 未定義
console.log(obj2.d);// tennis

Javascript 第5版 第8章
2010/01/13(水) 22:36 Javascript

8.1.1 入れ子型の関数

function内に入れ子で関数を定義できるが、
ifやforなどの文ブロック中には定義できない(関数リテラルは除く
function main(){
	function(){
	// OK
	}
	if(true){
		function(){
		// ダメ
		}
		var k = function(){
		// OK
		}
	}
}

8.2.1省略可能な引数

関数で引数を省略したときに、デフォルト値を設定する
if(!elem) はelemがnullまたは未定義でないかを判定できる。
同様にelem = elem || []; はelemが存在するならelemeを代入、そうでないなら[]を代入となる。
function test(o){
    if(!o) o = [];// oを指定しない時
}
function test(o){
    var o = o || [];// 上と同じ意味
}

Argumentsオブジェクト 可変長の引数リスト

argumentsは関数内で使うことができ、配列のようなオブジェクトで、
中身に関数を呼び出したときの引数が入っている。
!Argumentsオブジェクト≠配列
function test(){
    console.log(arguments);// [1,2,3]}
test(1,2,3)

これを利用すれば、可変長の引数を持つ関数も作ることができる。
仮引数は定義しないで、argumentsで引数を得ることで引数内の最大値を返す
function max(/* ... */){
    var m = Number.NEGATIVE_INFINITY;//数値型の-Infinityを代入
    for(var i=0,l=arguments.length;i<l;i++){
        if(arguments[i] > m) m = arguments[i];
    }
    return m;// 30
}
max(1,3,5,30, -2);

8.2.2.1 calleeプロパティ

Argumentsオブジェクトにはcalleeというプロパティが定義されている。
arguments.calleeは現在実行中の関数を参照するので、関数内で使えば、自身を呼び出すので、
再帰的に呼び出す関数を作成できます。
(function(x){
    if(x <=1)return 1;
    return x * arguments.callee(x-1);//arguments.calleeは呼び出した関数そのもの
    // 5*4*3*2*1 = 120 となる
})(5)

Javaチュートリアル第4版
2009/12/30(水) 17:06 Java

可変長引数

可変長引数を受けるには(type... 仮引数)という形で作る。
...が可変長であることを表す。
public class VarArgs {
    public static void main(String[] args) {
        String[] strs = {"test", "sas","tet"};
        prints(strs);
    }
    public static void prints(String... strs){
        for(int i=0;i<strs.length;i++){
            System.out.println(strs[i]);
        }
    }
}

クラスのインスタンス化

new演算子はあたら名オブジェクト用のメモリを割り当て、そのメモリの参照を返す。
クラスのインスタンス化とはオブジェクトを生成することであり、オブジェクトを生成する事は
クラスをnewすることなので、クラスのインスタンスを生成することになります。
そのためクラスのインスタンス化と言う。(インスタンスは非staticである)

staticとinstanceと。 - いまいにっき
http://d.hatena.ne.jp/imai78/20091229/1262102470

オブジェクトのコピーと継承
2009/11/20(金) 24:35 Javascript

循環参照を含むオブジェクトのディープコピー - 素人がプログラミングを勉強するブログ
http://d.hatena.ne.jp/javascripter/20081115/1226739628

	function deepCopy(orig) {
	  var clone = {};
	  return (function (orig, clone, visited, ref) {
	    for (var k in orig) {
	      var v = orig[k];
	      if (v instanceof Object) {
	        var i = visited.indexOf(v);
	        if (i == -1) {
	          var o = {};
	          visited.push(v);
	          ref.push(o);
	          clone[k] = arguments.callee(v, o, visited, ref);
	        } else {
	          clone[k] = ref[i];
	        }
	      } else {
	        clone[k] = v;
	      }
	    }
	    return clone;
	  })(orig, clone, [orig], [clone]);
	}
	// @src オブジェクトのコピーを返す
	function copyObject(src) {
		var dest;
		if (typeof src == 'object') {
			if (src instanceof Array) {
				dest = new Array();
				for (var i = 0; i < src.length; i++) {
					dest[i] = copyObject(src[i]);
				}
			} else {
				dest = new Object();
				for (prop in src) {
					dest[prop] = copyObject(src[prop]);
				}
			}
		} else {
			dest = src;
		}
		return dest;
	}
両方とも、lengthなどが扱えなくなる。
最速インターフェース研究会 :: JavaScriptにおけるdeep clone
http://la.ma.la/blog/diary_200711270645.htm

本当にそのままオブジェクトをコピーするならunevalしてevalするのが単純でいい。
Object.deep_clone = function(obj){
    return (typeof uneval == "function") ? eval(uneval(obj)) : eval(Object.toJSON(obj));
}
// Object.toJSONは別途適当に実装。prototype.jsに入ってたりしますね。
この場合はlengthも使用できる。

配列とオブジェクトのコピー - 宇宙野武士は元気にしているか
http://d.hatena.ne.jp/daisun/20080629/1214750999

チャイルドとして継承させる
function clone(obj) {
  var f = function();
  f.prototype = obj;
  return new f;
}
これはprototype継承を使って一部違うオブジェクトを作るに便利だが、書き換えたものは元のオブジェクトにも反映する事に注意。

E4XとDOM
2009/11/13(金) 25:20 Javascript

toStringしたものをreplaceで置換してinnerHTML
toSourceしてinnerHTML
E4Xの変数展開を理解
toXMLStringとDOMParser
Range + E4X
逆方向のアクセス
アクセス方法、変換方法 E4X XML ↔ DOMノード
まとめ
E4Xの特殊な動作、はまりどころ
E4Xの解釈を用いたXSS