【JS】JSを根本から再復習、関数とかオブジェクトとか
関数
JSの世界では、関数は実行可能なオブジェクトです。
具体的には、関数を引数として渡すことができたりします・。
コールバック関数
function hello() {
console.log('hello');
}
// 引数のcallbackに hello が渡ってくる
// この引数のことを callback 関数と呼びます
function sample(callback) {
callback("yo");
}
sample(hello);
// 無名関数だと下記のような書き方になる
sample(function(name) {
console.log('hello ' + name);
});
this
実行コンテキストによって this
の参照先は変わることになります。
呼び出し元の参照を保持し、
オブジェクト → 呼び出し元のオブジェクト
関数 → グローバルオブジェクトを指します。
callbackも関数に含まれます。
bind
this
や引数の参照先を変更し、使用時点で実行しません。
束縛するとは?
this
を固定するで理解しています。
JavaScript の超便利なメソッド bind で this を制御する – Foreignkey, Inc.
関数バインディング
call, apply
thisや引数のの参照先を変更し、使用時点で実行します。
アロー関数
無名関数を記述しやすくしたもので、() => {};
のように書くことができます。
無名関数とアロー関数の違い
アロー関数は、this
や arguments
の値を取りません。
ではどうやって this
の値を取ってきてるかというと、外側の this
を探しにいくことで値を取得することができるようになっています。
なので、アロー関数で定義した関数は bind
を使って this
を束縛することはできないことに注意します。
prototype
- オブジェクトに存在する特別なプロパティ
- prototypeの参照が、
__proto__
に コピーされる - prototypeを使用する理由は、メモリの効率化
- ES6になってからは、裏側でおごいているのがこいつになる
プロトタイプチェーン
プロトタイプの多重形成のことを指します。
下記のように __proto__
が層上になっている状態をプロトタイプチェーンと言います、
優先順位
基本は階層が浅いものから呼び出されることになります。
- 自分自身のプロパティ
- コンストラクターが持っているメソッド
- 他にprototypeを持っているか確認していく
- Objectに格納されているプロパティ(ここにもなければ、undefined)
クラス
ES6からクラス表記でかけるようになっています。
class Person {
// コンストラクタ
constructor(name, age) {
this.name = name;
this.age = age;
}
// Person.prototype.hello = function() { ... と同じことを表す
hello() {
console.log('hello ' + this.name);
}
}
// インスタンス化
const bob = new Person('Bob', 23);
console.log(bob);
コンストラクタ
新しくオブジェクトを作成するための土台となるものを指します。
インスタンス化
new
を使用し、コンストラクタ関数からオブジェクトを作成することを指します。
クラス継承と super
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
hello() {
console.log('hello ' + this.name);
}
}
// 継承には extends を使用します
class Japanese extends Person {
constructor(name, age, gender) {
// 継承元(Person)のコンストラクターを呼び出すことができる
// コンストラクターを呼び出しているため、name, ageを引数として渡している
super(name, age);
this.gender = gender;
}
hello() {
console.log('Konnichiwa ' + this.name);
}
}
オブジェクトリテラル
{}を使った初期化のことを指します。
チェーンメソッド
言葉の通り、メソッドを繋いでいくことを指します。
class Calculator {
constructor() {
this.val = null;
// アンダーバーはこのクラス内でしか使用しないという意味です。
this._operator;
}
set(val) {
if(this.val === null) {
this.val = val;
} else {
this._operator(this.val, val);
}
// チェーンを実装するためには、Calculatorのオブジェクトを返す必要がある
return this
}
plus() {
this._operator = function(val1, val2) {
const result = val1 + val2
this._equal(result)
}
return this
}
minus() {
this._operator = function(val1, val2) {
const result = val1 - val2
this._equal(result);
}
return this
}
_equal(result) {
this.val = result
console.log(result)
return this
}
}
// インスタンス化
const calc = new Calculator();
// チェーンメソッド
calc.set(10)
.plus()
.set(3)
.minus()
.set(4)
ビルトインオブジェクト
- String, Date, Numberとか
- Javascriptエンジンによって生成される
- JSの場合は、
String()
のように宣言するのではなく、 変数にstring
を入れてあげることで実行される
ラッパーオブジェクト
- プリミティブ値を内包するオブジェクト
- new しなくても暗黙的に
シンボル
プロパティの重複を避けるために必ず一意の値を返す関数のことを指します。
スプレッド演算子
ES6だと、可変長パラメータはスプレッド演算子で表現します。
...arry
のような書き方
スプレッド構文 - JavaScript | MDN
Author And Source
この問題について(【JS】JSを根本から再復習、関数とかオブジェクトとか), 我々は、より多くの情報をここで見つけました https://qiita.com/wqwq/items/88256e9b55e430e8fde1著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .