JavaScriptのクラスと継承
5063 ワード
一、ECMAScript 5標準中のクラス
1、原型類を定義する
以下は典型的な原型継承に関するコードです.
クラスの静的方法を起動するには、クラスの例が必要ではない.このクラスの例は、クラスのいずれかの静的方法を呼び出すことができない.これも
プロトタイプが従来のオブジェクトを継承する場合は、オブジェクトをプロトタイプのプロトタイプオブジェクトに設定することができます.
1、クラス
2、クラス引継ぎ
3、静態類
クラスは、従来のオブジェクト(構造不可能/非構造)を拡張できませんので、注意してください.従来のオブジェクトを継承する場合は、
1、原型類を定義する
/* Calcula */
var Calcula = function (x, y) {
this.x = x;
this.y = y;
}
/* Object.defineProperties Calcula.prototype ,
* ES6-Class ,
*/
Object.defineProperties(Calcula.prototype, {
add: {
configurable: false,
enumerable: false,
value: function () {
return this.x + this.y;
},
writable: false
},
sub: {
configurable: false,
enumerable: false,
value: function () {
let x = this.x;
let y = this.y;
if (x > y) {
return x - y;
} else if (x < y) {
return y - x;
} else {
return 0;
}
},
writable: false
}
});
const calcula = new Calcula(100, 900);
console.log(calcula.sub());
2、原型類の継承以下は典型的な原型継承に関するコードです.
/* Foo Constructor */
var Foo = function (name) {
this.name = name;
}
/* Foo prototype */
Foo.prototype = {
myName: function () {
console.log(this.name);
return this.name;
};
};
/* Bar Constructor , this Foo , Bar Foo */
var Bar = function (name, label) {
Foo.call(this, name);
this.label = label;
}
/* Bar Foo.prototype Bar prototype */
Bar.prototype = Object.create(Foo.prototype);
/* Bar */
Bar.prototype = {
myLabel: function () {
console.log(this.label);
return this.label;
};
};
const a = new Bar(" JavaScript", " ");
a.myName();
a.myLabel();
3、静態類クラスの静的方法を起動するには、クラスの例が必要ではない.このクラスの例は、クラスのいずれかの静的方法を呼び出すことができない.これも
this ,
を意味する.静的方法は、通常、アプリケーションのためのツール関数を作成するために使用されます.var Point = function (x, y) {
this.x = x;
this.y = y;
};
Point.distance = function (a, b) {
const x = a - b;
const y = a + b;
return Math.hypot(x, y);
};
console.log(p1.distance(10, 10)); // ,
console.log(Point.distance(p1, p2));
4、プロトタイプ拡張-従来のオブジェクトの継承プロトタイプが従来のオブジェクトを継承する場合は、オブジェクトをプロトタイプのプロトタイプオブジェクトに設定することができます.
/* 1: (JSON)*/
var Animal = {
hobby: [" ", " "],
speak() {
console.log(this.name + ' can speak English!');
console.log(this.hobby);
}
};
var Person = function (name) {
this.name = name;
};
Person.prototype = Animal;
var p = new Person(" ");
p.speak();
二、ECMAScript 6標準中のクラス1、クラス
/* Greeter , Constructor greet */
class Greeter {
constructor(message) {
this.greeting = message;
}
greet() {
return " ," + this.greeting;
}
}
let greeter = new Greeter("world");
console.log(greeter.greet());
Greerのクラスを声明しました.クラスの属性、クラスのコンストラクタ、クラスの方法があります.new
キーワードを使ってClassを実装すると、まず自分のコンストラクタ内の方法を実行します.2、クラス引継ぎ
extends
キーワードは、クラス宣言またはクラス表現において、他のクラスに続くサブクラスを作成するために使用されます.class Animal {
constructor(name) {
this.name = name;
}
eat() {
console.log(this.name + ' ');
}
}
class Dog extends Animal {
constructor() {
super();
}
}
var d = new Dog(' A');
d.eat();
サブクラスにコンストラクタがある場合は、「this」を使用する前に、まずsuper()を呼び出す必要があります.3、静態類
static
のキーワードは、クラスの静的方法を定義するために用いられ、クラスの例は必要ではない.このような例は、クラスのいずれかの静的方法を呼び出すことができない.これも this ,
を意味する.静的方法は、通常、アプリケーションのためのツール関数を作成するために使用されます.class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
static distance(a, b) {
const dx = a.x - b.x;
const dy = a.y - b.y;
return Math.hypot(dx, dy);
}
}
const p1 = new Point(5, 5);
const p2 = new Point(10, 10);
console.log(p1.distance(10, 10)); // ,
console.log(Point.distance(p1, p2));
4、クラス拡張-クラスは、従来のオブジェクトを継承します.クラスは、従来のオブジェクト(構造不可能/非構造)を拡張できませんので、注意してください.従来のオブジェクトを継承する場合は、
Object.setPrototypeOf()
に変更できます./* 1: (JSON)*/
const Animal = {
hobby: [" ", " "],
speak() {
console.log(this.name + ' can speak English!');
console.log(this.hobby);
}
};
class Person {
constructor(name) {
this.name = name;
}
}
// Animal Person
Object.setPrototypeOf(Person.prototype, Animal);
const d = new Person(" ");
d.speak();
/* 2: (Array)*/
const methods = [
" ",
" ",
{
name: " ",
hobby: [
" ", "LOL"
]
}
];
class Methods {
constructor(name) {
this.name = name;
}
}
Object.setPrototypeOf(Methods.prototype, methods);
const methodsItem = new Methods(" ");
console.log(methodsItem[2]);