オブジェクト指向について学んだ学生は、オブジェクト指向の 3 つの基本特性がカプセル化、継承、ポリモーフィズムであることを知っているはずですが、これら 3 つについてはあまり知らないかもしれません。言葉。フロントエンドの場合、最も公開されているのは encapsulation
と inheritance
ですが、ポリモーフィズムはあまり理解されていない可能性があります。
カプセル化について話す前に、まずカプセル化とは何かを理解しましょう。
カプセル化とは
カプセル化: オブジェクトをプログラム オブジェクトで実行するために必要なリソースをカプセル化します - 基本上記はメソッドとデータです。オブジェクトは「そのインターフェイスを公開」します。これらのインターフェイスにアタッチされている他のオブジェクトは、オブジェクトによって実装されているメソッドを気にせずにこのオブジェクトを使用できます。コンセプトは「やり方を教えないで、ただやってみろ。」 オブジェクトは自己完結型の原子と考えることができます。オブジェクト インターフェイスには、パブリック メソッドと初期化データが含まれます。 (Baidu Encyclopedia から抜粋)
カプセル化についての私の理解では、抽出
という別のステップがあるかもしれません。まず第一に、次のペアのどの属性メソッドから抽象化する必要があるかを知る必要があります。これらをベースとして、より適切なパッケージ化を行うことができます。
カプセル化は、そのプロパティとメソッドをカプセル化することに他なりません。
class Employees { constructor(name,age){ this.name = name; this.age = age; } getInfo(){ let {name,age} = this; return {name,age}; } static seyHi(){ console.log("Hi"); } } let lisi = new Employees("Aaron",18); lisi.seyHi(); // lisi.seyHi is not a function lisi.getInfo(); // {name: "Aaron", age: 18} Employees.seyHi(); // Hi
から抽出されたパブリック属性は name
です。 age
、パブリック メソッドは getInfo
、seyHi
ですが、getInfo
と seyHi
の違いは seyHi
static
修飾子は、静的メソッドに変更するために使用されます。seyHi
は、Employees
クラスにのみ属します。ただし、getInfo
メソッドはインスタンスに属します。
は、seyHi
メソッドのアクセス権をカプセル化するためにここで使用されます。 別の例を挙げてみましょう。
Promise.then() // Promise.then is not a function let p1 = new Promise(() => {}) p1.then(); // Promise {<pending>} Promise.all([1]); // Promise {<resolved>: Array(1)}
上記のコードからわかるように、
Promise は static
を使用してメソッドのアクセス許可をカプセル化します。
: 継承といえば馴染みのないものではありません。継承により、サブクラスに親クラスのさまざまなパブリック プロパティを持たせることができます属性とパブリックメソッド
。同じコードを再度記述する必要はありません。サブカテゴリに親カテゴリを継承させながら、一部の属性を再定義して一部のメソッドをオーバーライドすることができます。つまり、親カテゴリの元の属性とメソッドを上書きして、親カテゴリから異なる関数を取得できるようにします。 (Baidu百科事典より抜粋) サブクラスが親クラスを継承すると、サブクラスは親クラスのプロパティとメソッドを持ちますが、独自のプロパティとメソッドも持ちます。サブクラスは親クラス以上である必要があり、親クラス以上である必要があります。
class Employees { constructor(name){ this.name = name; } getName(){ console.log(this.name) } static seyHi(){ console.log("Hi"); } } class Java extends Employees{ constructor(name){ super(name); } work(){ console.log("做后台工作"); } } let java = new Java("Aaron"); java.getName(); java.work(); // java.seyHi(); // java.seyHi is not a function
上記の例から、継承では親クラスの静的メソッドは継承されず、親クラスのパブリック プロパティとメソッドのみが継承されることがわかります。これには注意が必要です。
継承後、サブクラスには
getName メソッドだけでなく、独自の worker
メソッドもあります。
: 文字通りの意味は「複数の状態」であり、サブクラス型のポインタを親ポインタに割り当てることができます。クラスタイプに。 (Baidu百科事典より抜粋) 端的に言うと、ポリモーフィズムは同じもので、同じメソッドが呼び出され、パラメータが同じ場合、動作が異なります。ポリモーフィズムは、動作ポリモーフィズムとオブジェクト ポリモーフィズムの 2 つのタイプに分類されます。
多態性式の書き換えとオーバーロード。
オーバーライドとは
オーバーライド: サブクラスは、同じメソッドを書き換えることなく、親クラスのメソッドを継承できます。ただし、サブクラスが親クラスのメソッドを変更せずに継承するのではなく、メソッドの書き換えが必要となる特定の変更を加えたい場合があります。メソッドのオーバーライドは、メソッドの上書きとも呼ばれます。 (百度百科事典より抜粋) class Employees {
constructor(name){
this.name = name;
}
seyHello(){
console.log("Hello")
}
getName(){
console.log(this.name);
}
}
class Java extends Employees{
constructor(name){
super(name);
}
seyHello(){
console.log(`Hello,我的名字是${this.name},我是做Java工作的。`)
}
}
const employees = new Employees("Aaron");
const java = new Java("Leo");
employees.seyHello(); // Hello
java.seyHello(); // Hello,我的名字是Leo,我是做Java工作的。
employees.getName(); // Aaron
java.getName(); // Leo
は Employees
を継承しますが、seyHello はサブクラスとさまざまなニーズを満たすために、サブクラスは親クラスを継承し、
seyHello メソッドを書き換えます。したがって、呼び出したときに異なる結果が得られます。サブクラスは親クラスを継承するため、サブクラスも親クラスの
getName メソッドを持ちます。
重载就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。(节选自百度百科) 因为JavaScript是没有重载的概念的所以要自己编写逻辑完成重载。 在上面的代码中定义了 这样完成了一个简单的类重载。 封装可以隐藏实现细节,使得代码模块化; 继承可以扩展已存在的代码模块(类),它们的目的都是为了——代码重用。 多态就是相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。多态分为两种,一种是行为多态与对象的多态。 在编程的是多多运用这个写思想对其编程时很有用的,能够使你的代码达到高复用以及可维护。 相关免费学习推荐:js视频教程 以上がオブジェクト指向 JavaScript の 3 つの基本特性の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。class Employees {
constructor(arg){
let obj = null;
switch(typeof arg)
{
case "string":
obj = new StringEmployees(arg);
break;
case "object":
obj = new ObjEmployees(ObjEmployees);
break;
case "number":
obj = new NumberEmployees(ObjEmployees);
break;
}
return obj;
}
}
class ObjEmployees {
constructor(arg){
console.log("ObjEmployees")
}
}
class StringEmployees {
constructor(arg){
console.log("StringEmployees")
}
}
class NumberEmployees {
constructor(arg){
console.log("NumberEmployees")
}
}
new Employees({}) // ObjEmployees
new Employees("123456") // StringEmployees
new Employees(987654) // NumberEmployees
Employees
,ObjEmployees
,StringEmployees
,NumberEmployees
类,在实例化Employees
的时候在constructor
里面进行了判断,根据参数的不同返回不同的对应的类。总结