JavaScript OOP


OOPとは?


オブジェクト向け-オブジェクト向けプログラミングは、オブジェクト向けプログラミングです.
OOPは言語が持つパターンである.
オブジェクト向けプログラミングは、従来のプログラム化プログラミングとは異なる観点、すなわち関数の集合または単純なコンピュータの命令リストではなく、関係のあるオブジェクトの集合であるソフトウェア設計と見なすことができる.
典型的なプロセス向け言語はC,オブジェクト向け言語はJavaである.

「人間が世界を見たり理解したりする方法を真似てコードを書きます。」



チェックコード


次のコードは、自動車がフィーチャー(プロパティ)と機能(メソッド)を持つオブジェクトを宣言したかどうかを示します.
プロシージャ向けのコードに複数の自動車を作成する場合は、maker、name、maxSpeedという変数(property)を宣言する必要があります.オブジェクト向けのコードでは、異なる変数名を使用して複数の自動車を作成できます.
生産性が高いということは、新しい車を簡単に生産できることを意味します.
//절차지향
let maker = 'bmw';
let name = '320d';
let maxSpeed = 200;

function forward(speed){return console.log(`최고속도 ${speed}으로 달리고있습니다!!`);}
function reverse(){}
function toot(){console.log('빵빵!!')}
forward(maxSpeed);//최고속도 200으로 달리고있습니다!!


//객체지향
let car  = {
  maker : "bmw",
  name : "320d",
  maxSpeed : 200,
  forward  : function(){ return console.log(`최고속도 ${this.maxSpeed}으로 달리고있습니다!!`)},
  reverse  : function(){},
  toot  : function(){console.log('빵빵!!')}
}
car.forward();//최고속도 200으로 달리고있습니다!!

JavaScript OOPの機能


1.パッケージ


オブジェクトを宣言した後、データを保護する必要があります.カプセル化により、オブジェクト内のデータに外部から直接アクセスできません.もう一つの説は情報の隠匿であり、隠匿化とも呼ばれる.

2.継承性


子オブジェクトが親オブジェクトを継承して使用する場合、継承の概念が使用されます.
つまり、親に宣言された機能を子に継承または拡張します.
JavaScriptはPrototypeを使用してオブジェクト階層の継承です.

3.抽象


オブジェクトには、複数のフィーチャー(プロパティ)と機能(メソッド)があります.多くのオブジェクトは、異なる特徴と機能を持っているか、完全に同じである可能性があります.
複数のオブジェクトの共通の分母を1つ以上の失敗したオブジェクト(親オブジェクト)に結合し、機能を継承に拡張することで、コードの重複性と再利用性を向上させることができます.

4.多方向性


子オブジェクトで親から継承するメソッドを使用してオーバーライド(再定義)します.

JavaScript instantiation Patterns


JavaScriptでクラスが現れる前に使用した4種類の宣言方式.

1. Functional


Car()を実行するたびにsomeInstanceオブジェクトが生成されます.
someInstanceオブジェクトは、指定したフィーチャーとメソッドでオブジェクトに追加されます.
ブレークポイントを生成するたびに、メソッドがあるため、メモリが大量に消費されます.
メソッドが重複する問題を解決できません.
var Car = function(){
  var someInstance  = {};
  someInstance.position = 0;
  someInstance.move = function(){
    this.position += 1;
  }
  return someInstance;
}
var car1 = Car();
var car1 = Car();
car1.move();
console.log(car1.position);//1

2. Functional Shared


functionalとあまり変わらないが、extendという関数を作成し、使用するメソッドセットを作成することで、functionalはメソッドの重複を解決することができる.
var extend = function(to, from){
  for(var key in from){
    to[key] = from[key];
  }
};
var someMethods = {};
someMethods.move = function(){
  this.position += 1;
}
var Car = function(position){
  var someInstance  = {
    position:position,
  };
  extend(someInstance, someMethods);
  return someInstance;
}
var car1 = Car(5);
var car1 = Car(10);

3. Prototype


Object.createの使用方法.
Object.createは、特定のオブジェクトをプロトタイプとするオブジェクトを生成します.
var someMethods = {};
someMethods.move = function(){
	this.position += 1;
}
var Car = function(position){
  var someInstance  = Object.create(someMethods);
	someInstance.position = position;
  return someInstance;
}
var car1 = Car(5);
var car2 = Car(10);

4. Pseudoclassical


インスタンスを生成するジェネレータnewキーワードを使用します.
var Car = function(position) {
	this.position = position;
}
Car.prototype.move = function(){
	this.position += 1;
}
var car1 = new Car(5);
var car2 = new Car(10);

プロトタイプとは?


プロトタイプスキーム


関数オブジェクトのみを持つプログラム.
関数オブジェクトが作成者として使用される場合、関数によって作成されるオブジェクトの親として機能するオブジェクト(Prototypeオブジェクト)を指します.
つまり、Prototypeオブジェクトは、あるオブジェクトを作成するためにそのオブジェクトの母体となるオブジェクトであり、サブオブジェクトに継承する属性である.

[[Prototype]proto Property


関数を含むすべてのオブジェクトが持つIntunnelスロット.
対象の立場で親の役割を果たすPrototype対象を指す.
ECMAScriptは暗黙的プロトタイプリンクと呼ばれ、proto propertyに格納されます.
prototype propertyとは、関数の角度から自分のリンクしたサブオブジェクトに渡されるprototypeオブジェクトを指し、protopropertyとは、オブジェクトの角度から親オブジェクトprototypeオブジェクトを内部の非表示リンクとすることを指す.

コンストラクタ


プロトタイプオブジェクトには、コンストラクション関数プロトタイプがあります.
コンストラクション関数Propertyとは、作成したオブジェクト(インスタンス)の角度から独自の関数を作成することです.
注意:https://iamsjy17.github.io/javascript/2019/06/10/js33_17_prototype.html