blog

J42 プロトタイプチェーン

1.これを見つけるための普通の関数2.すべての配列はArrayクラスのインスタンスです1.すべてのオブジェクトはObjectクラスのインスタンスです2.すべての数値はNumberクラスのインスタンスで...

Sep 22, 2020 · 2 min. read
シェア

通常の関数で thisを探す

インスタンスの作成と作成されたインスタンスの値の比較、プライベートプロパティのインスタンス検出

function Fn() { // this.xxx=xxx これらはすべて、現在のインスタンスに対する "プライベート "メソッドである。”属性 this.x = 100; this.say = function () {}; } Fn(); //=>this:window let f1 = new Fn(); //=>this:クラスFnの現在のインスタンスf1 let f2 = new Fn(); //=>f1インスタンスオブジェクトのプライベートプロパティxの値を取得する === f2インスタンスオブジェクトのプライベートプロパティxの値を取得する console.log(f1.x === f2.x); //=>true //f1とf2のヒープは同じヒープではない。 console.log(f1.say === f2.say); //=>false //プライベート・プロパティ名が含まれているかどうかを検出する例:hasOwnProperty console.log(f1.hasOwnProperty('say')); //=>true

各配列はArrayクラスのインスタンスです。

  • 1.すべてのオブジェクトはObjectクラスのインスタンスです。

  • 2.各数字はNumberクラスのインスタンスです。

    /* 各配列は組み込み配列クラスであるArrayのインスタンス */ let arr1 = [10, 20]; let arr2 = [30, 40];

プロトタイプの連鎖

  • 1.すべての関数はprototypeというプロパティを持って生まれ、関数のprototypeのプロパティの値はオブジェクト⇒"prototypeオブジェクトに格納されているプロパティとメソッドは、現在のクラスインスタンスが呼び出すために公開されているプロパティとメソッドである"
    • 普通の関数
    • クラスも関数型の値
  • 2.クラスのプロトタイプオブジェクトには、デフォルトでコンストラクタという組み込み属性があり、属性の値は現在のクラスそのものなので、クラスはコンストラクタとも呼ばれます。
  • 3.すべてのオブジェクトは、現在のインスタンスが属するクラスのプロトタイプであるprotoというプロパティを持って生まれます。
  • 1) オブジェクトデータ型の値
    • 配列オブジェクト
    • 通常のオブジェクト
    • 通常のオブジェクト
  • 2) インスタンスもオブジェクト型の値
  • 3) クラスのprototype属性の値もオブジェクトです。
  • 4) 関数にもオブジェクトの特性があります。
  • 5) すべてのオブジェクト・データ型の値は、組み込みクラスObjectのインスタンスです。

プロトタイプ thisエクササイズ

function Fn() {
	this.x = 100;
	this.y = 200;
	this.getX = function () {
		console.log(this.x);
	}
}
Fn.prototype.getX = function () {
	console.log(this.x);
};
Fn.prototype.getY = function () {
	console.log(this.y);
};
let f1 = new Fn;
let f2 = new Fn;
console.log(f1.getX === f2.getX);
console.log(f1.getY === f2.getY);
console.log(f1.__proto__.getY === Fn.prototype.getY);
console.log(f1.__proto__.getX === f2.getX);
console.log(f1.getX === Fn.prototype.getX);
console.log(f1.constructor);
console.log(Fn.prototype.__proto__.constructor);
f1.getX();
f1.__proto__.getX();
f2.getY();
Fn.prototype.getY();

プロトタイプ演習

function Fn(num) {
	this.x = this.y = num;
} 
 Fn.prototype.AA = 100;
Fn.prototype = {
	x: 20,
	sum: function () {
		console.log(this.x + this.y);
	}
};
let f = new Fn(10);
console.log(f.sum === Fn.prototype.sum);
f.sum();
Fn.prototype.sum();
console.log(f.constructor); 

Read next

Js クロージャ

クロージャは、関数が現在のレキシカルスコープ外で実行されたとしても、関数がそのレキシカルスコープを記憶してアクセスするときに作成されます。 簡単に言うと、クロージャとは、そのレキシカル・スコープ内の変数にアクセスできる関数のことです。 foo関数はbar関数の戻り値を変数aに渡して呼び出された状態で実行されます。参照型の性質上、barとaはもともと...

Sep 22, 2020 · 2 min read