okinawa

勉強メモ

JavaScriptのオブジェクトメモ

参考

www.oreilly.co.jp

基本

すべてのオブジェクトは可変。StringもObjectも。でもネイティブオブジェクトの変更は非推奨。

instanceOfは何のインスタンスかを判定。Objectは常にtrue.全てのオブジェクトはObjectを継承しているから。

let s = “aaa”;
console.log(s instanceof String); // true
console.log(s instanceof Object); // true

プリミティブ型をオブジェクトのように扱うと、その時だけオブジェクト扱いになり、そのあとはプリミティブ型に戻る。

let s = “abc”;
s.length; // オブジェクト扱い

ドット記法。cody.living ブラケット記法。cody[“living”]

ブラケット記法なら変数使える。

let s = “liv”;
let s2 = “ing”;
cody[s + s2];

オブジェクト内に存在しないプロパティにアクセスしようとすると、JavaScriptはその関数がコンストラクタを持つ限り、プロトタイプチェーンをさかのぼって上位オブジェクト内まで見る。最上位はObject.prototype。P44

プロパティが見つからずにundefinedが返された場合は、プロトタイプチェーンをさかのぼった結果、上位のオブジェクト内にも該当のプロパティ見つからなかったということ。

hasOwnPropertyはプロトタイプチェーンをさかのぼらず探す。inはさかのぼって探す。

let test = {“foo”};
console.log(test.hasOwnProperty(“toString”)); // false
console.log(“toString” in test); // true

全てのオブジェクトはObject.prototypeから継承する。

関数もオブジェクト。つまり値。変数や配列に値として格納できる。戻り値にもできる。

5章 グローバルオブジェクト

グローバルオブジェクトはすべてのオブジェクトを格納する唯一無二のオブジェクト。

グローバル変数、グローバルプロパティはグローバルオブジェクト直下に格納されている。

ブラウザでのグローバルオブジェクトはwindow。

グローバル直下には全てのスコープがアクセスできる。だからwindow.alert()のようなグローバルメソッドはどこからでも呼べる。

JavaScriptを記述する際はグローバルオブジェクトに記述しているということらしい。

var myStringVar = 'myString'; // letにするとfalseになるんだが?
console.log('myStringVar' in window); // 出力:true(*)

6章 thisとはなにか、thisは何を参照するか

グローバルスコープのthisはグローバルオブジェクトを参照する。

関数の中で使われるthisは親オブジェクトを参照する。

var body = {
    living : true,
    age : 33,
    gender : 'male',
    getGender : function() { return body.gender; } //下と同じ
    getGender : function() { return this.gender; } // genderの親プロパティはbody
};

thisの値の決まり方。

window.hoge = 'hoge'; // グローバルオブジェクト直下
window.myObject = {hoge: 'I am myObject.hoge'};

window.sayhoge = function() {
    console.log(this['hoge']);
};

window.myObject.sayhoge = sayhoge;

window.myObject.sayhoge(); // こっちのsayhoge()のthis(親オブジェクト)はmyObjectなので'I am myObject.hoge'を出力
window.sayhoge(); // こっちのsayhoge()のthisはwindow(グローバルオブジェクト)なので'hoge'を出力

コンストラクタはreturnを書かなくても、インスタンス自身が返される。つまりreturn this。JavaScriptではコンストラクタ内のthisは自分自身のインスタンスのこと。だからnewするとインスタンスが返ってくる。

7章 スコープとクロージャ

クロージャはスコープチェーンに存在する変数への参照を(囲い込んで)保持している関数。

prototypeプロパティははすべてのFunction()インスタンスに自動的に付与される。

var func = function(){};
console.log(typeof func.prototype); // object

プロトタイプチェーンはprotoプロパティによって構成される?

Array.prototype.foo = 'foo'; // Array()のすべてのインスタンスがfooプロパティを継承
var myArray = new Array();

// *.constructor.prototypeを使用する(冗長な)方法でfooの値をトレース
console.log(myArray.constructor.prototype.foo); // 出力:'foo'
console.log(myArray.__proto__.foo); // 出力:'foo'

// プロトタイプチェーンを使うこともできる
console.log(myArray.foo) // 出力:'foo'

14章 null

undefinedは未定義で存在すらない。nullは値が代入されていない。

未定義というのはプロトタイプチェーンでも発見できないもの。