« 2011年2月 | トップページ | 2011年4月 »

2011年3月

2011年3月30日 (水)

書籍 97 Things Every Programmer Should Know

オライリーから出ている情報処理系の技術者向けの本で、
「97 Things Every Programmer Should Know」というのがあります。

日本語訳の本も出ていて、それには日本人が追加で記事を書いていたりするのですが、
この英語の本、すごく良いです。

ただ、技術者以外には、英語が分かる人でも、意味が分からないと思います。

良い点は、
1)英文が読みやすい。(内容が専門的である分、著者の主張を理解すれば、話の流れが予想でき)
2)英語の勉強になる
3)ひとつの話が短い(kindleで、3ページくらいのものも)
4)技術者の発想を知ることができる
5)著者が多いため、英語のいろいろな語り口を知ることができる

私はオライリーの電子書籍で買って、kindleで読んでいます。

技術書じゃなくでも、こういう形式のミニコラム集があれば、読みたいな。

97 Things Every Programmer Should Know: Collective Wisdom from the ExpertsBook97 Things Every Programmer Should Know: Collective Wisdom from the Experts

販売元:Oreilly & Associates Inc
Amazon.co.jpで詳細を確認する


| | コメント (0) | トラックバック (0)

2011年3月 9日 (水)

javaScript jQueryを読む

/*
jqueryを読む。
バージョンは、1.5.1を使っております。

とりあえず、大枠はこんな感じ。
特別な意味をなくすため、変数名を「jQuery」ではなく、「o1」などとしています。
*/



(function( w, undefined ) {
var o1 = (function () {
var o2 = function( selector,context ) { console.log('gaga'); };

return o2;
})();
w.o3 = w.$ = o1;
})(window);

o3(); //gaga
console.log(o3 === $); //true
$(); //gaga



//////////////////////////////////////

まず、即時実行関数として大ソトの構造
(function( w, undefined ) {
})(window);
これは、定義した関数を、グローバルオブジェクトwindowを引数にしてすぐに実行しています。

次に、
var o1 = ...
の部分ですが、これも即時実行関数で、返却されたo2がo1に入ります。
o1は、グローバルオブジェクトの$とo3に代入されます。
これによって、大ソトの構造外でもこれらの変数が利用可能になります。
o3も$も、実態はo2に代入された関数です。

macだと対応する括弧に移動できるエディタが見当たらないです。
知ってる人が入れば教えてください。Eclipse?

| | コメント (0) | トラックバック (0)

javaScript prototypeは関数オブジェクトに自動でできるプロパティ(型はオブジェクト)

javaScriptは、下記のような練習をして慣れていくしかないなー。


function F() {}
F.prototype.name = 'gabi';

var x1 = new F();

var o1 = F.prototype; //退避

var o2 = { name: 'taro' };
F.prototype = o2; //上書き

var x2 = new F();

console.log(o1.name); //gabi 元のプロトタイプは生きている
console.log(x1.name); //gabi x1は、元のプロトタイプを見ている
console.log(x2.name); //taro x2は、上書きされたプロトタイプを見ている

| | コメント (0) | トラックバック (0)

2011年3月 7日 (月)

javaScript []によるプロパティへのアクセス

javaScriptで、オブジェクトのプロパティにアクセスするときに、o.nameの形式とは別に、
o['name']という形式があります。これを使うと、文字型の変数を使ってプロパティに
アクセスできます。

動的な操作を行うときによく使われる模様です。

//関数の定義
function Test() {}

//配列の定義
var ary = ['a','b','c','d'];

for(var i = 0; i < ary.length; i++) {
var element = ary[i];

//Testオブジェクトが、elementプロパティを持っていなければ
if(typeof Test[element] !== 'object') {

//elementプロパティを設定
Test[element] = {
name: element + element + element
};
}
}

//Testオブジェクトに、aプロパティができた
console.log(Test.a.name); //aaa

| | コメント (0) | トラックバック (0)

2011年3月 2日 (水)

javaScript constructorプロパティ

//constructerプロパティを持つものは何か

function F() { this.name = 'taro'; }

var o = new F();

//何がconstructerプロパティを持っているのか

console.log(a.constructor); //function Object() ...
console.log(F.constructor); //function Function() ...
console.log(F.prototype.constructor); //function F() {this.name='taro';}
console.log(o.constructor); //function F() {this.name='taro';}

//全部持ってるんですね。

//プリミティブ型は持ってないはず

var i = 0;
var s = 'a';
var u; //undefined

console.log(i.constructor); //function Number() ...
console.log(s.constructor); //function String() ...
//console.log(u.constructor); //ERROR

//あれ、i,sも持ってることになってる。
//プロパティにアクセスしたことで、一時的にNumber,Stringオブジェクトに
//型変換されたんでしょう

//constructerプロパティは、関数オブジェクトなので、
//それを使って新しいオブジェクトを作れるはずです。

var o2 = new F.prototype.constructor();

console.log(o2.name); //taro

//作れました。

//下の2つは同じオブジェクト?
console.log(F.prototype.constructor == o.constructor); //true
console.log(a.constructor == b.constructor); //true

//同じでした。

//自前で持ってる?
console.log(F.prototype.hasOwnProperty('constructor')); //true
console.log(o.hasOwnProperty('constructor')); //false
console.log(a.hasOwnProperty('constructor')); //false

//インスタンスのconstructorは、プロトタイプチェーンで与えられるようです。

//constructorは、代入可能なので、上書きして破壊してみます。
function F2(){ this.name = 'jiro';}
F2.prototype.constructor = 100;
var o3 = new F2();
console.log(o3.name); //jiro
console.log(o3.constructor); //100

//継承の実験

function Parent() {this.name = 'saburo';}
function Child() {}

Child.prototype = new Parent();

var child = new Child();
console.log(child.name); //saburo
console.log(child.constructor); //function Parent() ...

//prototypeの代入による継承は、constructorが変になるみたい。
//(newしたのはChildなのに、constructorは、Parentになってる)

| | コメント (0) | トラックバック (0)

javaScript 関数オブジェクト prototype

prototypeプロパティは、
 全てのオブジェクトにつく
ではなく、
 全ての関数オブジェクトにつく
ということらしい。

関数オブジェクトは、newの対象となって、オブジェクト生成を行えるオブジェクトで、
その生成によって生じたオブジェクトが、prototypeプロパティのオブジェクトを
参照している。(生成された(非関数)オブジェクトはprototypeプロパティを持たない)

ということでOKでしょうか?

var o1 = {my_name:'taro'};

function FFF() {}

var f = function() {};

console.log(typeof o1.prototype); //undefined
console.log(typeof FFF.prototype); //object
console.log(typeof f.prototype); //object


FFF.prototype = o1;

var fff = new FFF();

console.log(typeof fff.prototype); //undefined
console.log(typeof FFF.my_name); //undefined
console.log(typeof fff.my_name); //string

| | コメント (0) | トラックバック (0)

2011年3月 1日 (火)

javasScript 関数とtypeof

typeofでいろいろやってみた。

var o = {};
console.log(typeof o);

var f = function () {};
console.log(typeof f);

function f2 () {};
console.log(typeof f2);

f2 = 'aaa';
console.log(typeof f2);

var f3 = function fsan () {
console.log(typeof fsan);
};
console.log(typeof fsan);

f3();

答え:
object,function,function,string,undefined,function

f2の上書きができてしまうあたりが危険です。

| | コメント (0) | トラックバック (0)

javaScript 関数の代入

javaScriptの式を見るときに、よく似ていて意味が違うのが、

var a = function () { ... };

var b = function () { ... } ();
です。

aは右辺で生成された関数オブジェクトが代入されましたが、
bは、右辺の関数オブジェクトが実施された結果が代入されています。

何が代入されたかはreturn文によって決まります。

よって、
var c= function ...という記述を見かけた場合、そのケツにカッコがあるかどうかを追いかけ、
ある場合は、returnしている要素を凝視します。

以下の3つの違いがわかりますか?


var o = function () {
var name = 'taro';
function sayHello(){
console.log('Hello ' + name);
}
sayHello();
};

o();

var o2 = function () {

var name = 'jiro';
return function () {
console.log('Hello ' + name);
}
}();

o2();

var o3 = function () {
var name = 'saburo';
return {
sayHello: function () {
console.log('Hello ' + name);
}
}
}();

o3.sayHello();

結果: Hello taro, Hello jiro, Hello saburo

| | コメント (0) | トラックバック (0)

« 2011年2月 | トップページ | 2011年4月 »