ES 6のクラス
7764 ワード
参照リンク:https://segmentfault.com/a/11...参照リンク:https://segmentfault.com/a/11...
何がクラスですか
オブジェクト指向プログラミングにおけるクラスは、状態(メンバー変数)と挙動実現(メンバー関数または方法)のためのオブジェクトを作成するための初期値を提供する拡張プログラムコードテンプレートです.
実際の開発において、私たちは多くの同じ種類のオブジェクトを作成する必要があります.newの一つのfunctionによってオブジェクトを作成することができることは知っていますが、現代のJavaScriptには、より高級な「クラス」構造があり、対象に向けてプログラミングするのにいい特性があります.
基本文法
多くのJavaScriptエンジンのクラス構造関数の文字列表示形式は「class...」で始まる.
ある属性に対して、値関数と値取り関数を設定し、この属性のアクセス挙動をブロックします.
JavaScriptには、2つのタイプのオブジェクトフィールド(属性と方法)があります.
公共の:どこにでもアクセスできます.外部インターフェースを含みます.私たちは開発においていつもよく使われているのは、公共の属性と方法です.
これはjsによって追加されたクラス属性に対するシンタックスであり、jsエンジンは現在部分的にサポートされています.
何がクラスですか
オブジェクト指向プログラミングにおけるクラスは、状態(メンバー変数)と挙動実現(メンバー関数または方法)のためのオブジェクトを作成するための初期値を提供する拡張プログラムコードテンプレートです.
実際の開発において、私たちは多くの同じ種類のオブジェクトを作成する必要があります.newの一つのfunctionによってオブジェクトを作成することができることは知っていますが、現代のJavaScriptには、より高級な「クラス」構造があり、対象に向けてプログラミングするのにいい特性があります.
基本文法
class MyClass{
constructor(){}
method1(){}
method2(){}
method3(){}
}
その後、new MyClassを通じて、上記の方法を有するオブジェクトのインスタンスを作成し、同時にnewオペレータ構造法によって自動的に呼び出される.これは構造方法においていくつかの初期化作業ができることを意味する.class User{
constructor(name){
this.name = name
}
showInfo(){
alert(this.name)
}
}
var user = new User('WhiteCode') // new , this.name
user.showInfo()
//
クラスは関数の一種です.class User{ // User
constructor(name){
this.name = name
}
showInfo(){ // User.prototype showInfo
// , User
alert (this.name)
}
}
alert(typeof User)//function
alert(User === User.prototype.constructor) //true
alert(User.prototype.showInfo)//showInfo(){ alert (this.name) }
// there are exactly two methods in the prototype
alert(Object.getOwnPropertyNames(User.prototype)) //constructor,showInfo
ES 5とES 6の比較es5
function People(name,age){
this.name = name
this.age = age
}
People.prototype.say = function(){
console.log("hello")
}
People.see = function(){
alert("how are you")
}
var a = new People()
a.say()
. es6 class
class People{
constructor(name,age){
this.name = name
this.age = age
}
see(){ alert('how are you')}
say(){
console.log('hello')
}
}
var a = new People()
a.say()
①Peopleは一つの種類であり、一つの関数でもあります.②constructorは、オブジェクトが指すPeople関数であり、nameとageのプロパティが掛けられている.③say関数をPeopleの原型にマウントします.多くのJavaScriptエンジンのクラス構造関数の文字列表示形式は「class...」で始まる.
。 , enumerable false。
。 。
従来の関数とは異なり、newがないと、クラス構造関数を呼び出すことができません.class User{
constructor(){}
}
alert(typeof User);//function
User();// Error: Class constructor User cannot be invoked without 'new'
関数のように、クラスは別の表現で定義され、伝達、戻り、割り当てなどができます.let User = class{ // ,
showInfo(){
alert('hello')
}
}
new User().showInfo()
必要に応じて動的にクラスを作成できます.function makeClass(rass){
// declare a class and return it
return class{
showInfo(){
alert(rass)
}
}
}
// Create a new class
let User = makeClass('hello')
new User().showInfo()//hello
Getters/Setters// getter/setter, , get/set user.name
class User{
constructor(name){
this._name =name
}
get name(){
return this._name
}
set name(value){
if(value.length<4){
alert(' ')
return
}
this._name = name
}
}
let user = new User('biubiu')
alert(user.name)
user = new User()// '
Userのプロトタイプオブジェクトでは、クラス宣言によりget/setを作成します.Object.defineProperties(User.prototype,{
name:{
get(){
return this._name
},
set(name){
// ...
}
}
})
class User {
name = "see"
sayHi(){
alert(`hello,${this.name}!`)
}
}
new User().sayHi()
// User new ,
クラスの内部でgetとsetキーワードが使えます.ある属性に対して、値関数と値取り関数を設定し、この属性のアクセス挙動をブロックします.
class MyClass {
constructor(){
// ...
}
get prop(){
return 'getter';
}
set prop(value){
console.log('setter:'+ value)
}
}
let inst = new MyClass()
inst.prop = 124 //setter:124
var a = inst.prop
console.log(a) //getter
// prop ,
保存関数と取得関数は、プロパティdescriptorオブジェクトに設定されています.class CustomHTMLElment {// descriptor
constructor(element){
this.element = element
}
get html(){
return this.element.innerHTML
}
set html(value){
this.element.innerHTML = value
}
}
// Object.getOwnPropertyDescriptor , underfined
var descriptor = Object.getOwnPropertyDescriptor(CustomHTMLElment.prototype,'html')
console.log(descriptor) //{enumerable: false, configurable: true, get: ƒ, set: ƒ}
// html
console.log('get' in descriptor)//true
console.log('get' in descriptor)//true
Es 6におけるクラスの私有と保護された属性及び方法JavaScriptには、2つのタイプのオブジェクトフィールド(属性と方法)があります.
公共の:どこにでもアクセスできます.外部インターフェースを含みます.私たちは開発においていつもよく使われているのは、公共の属性と方法です.
class MBWCar{
oilAmount = 0
constructor(power){
this.power = power
alert(`Created a mbw-car,power: ${power}`)
}
}
let mbwCar = new MBWCar(100)
mbwCar.oilAmount = 200
// oilAmount power ,
// oilAmount protected
保護された属性は通常以下の線を引く.プレフィックスのためにこれは言語レベルで強制的に実行されるものではないが、我々プログラマの間には周知の慣例があり、外部からこれらの属性および方法にアクセスするべきではない.class MBWCar{
_oilAmount = 0
constructor(power){
this._power = power
}
set oilAmount(value){
if (value<0) throw new Error('Negative oil')
this._oilAmount = value
}
get oilAmount(){
return this._oilAmount
}
}
let mbwCar = new MBWCar(100)
mbwCar.oilAmount = -10 //Error Negative oil
console.log(mbwCar) // , 。
パワー属性は読み取り専用属性に設定できます.値は変更できません.class MBWCar{
constructor(power){
this._power = power
}
get power(){
return this._power
}
}
let mbwCar = new MBWCar(100)
alert(`Power is: ${mbwCar.power}W`)
mbwCar.power = 25//Error (no set)
getter/setter方法class Car{
_oilMount = 0
setOilMount(value){
if(value<0)throw Error('Negative oil')
this._oilMount = value
}
getOilMount(){
return this._oilMount
}
}
let car = new Car()
car.setOilMount(100)
alert(car.getOilMount())
//
// Car Car this._oilMount this._power
プライベートフィールドこれはjsによって追加されたクラス属性に対するシンタックスであり、jsエンジンは現在部分的にサポートされています.
class Car{
#oilLimit = 100
#checkOil(value){
if(value>0) throw Error('Negative oil')
if(value > this.#waterLimit) throw new Error('Too much oil')
}
}
let car = new Car()
car.#checkOil() //error
car.#waterLimit = 1000 //Error
class BWMCar extends Car{
methods(){
alert(this.#oilLimit) // Error: can only access from Car
}
}
プライベートフィールドはthis[name]を通じてアクセスできません.class User{
sayHi(){
let filedName = 'Darkcod'
alert(`Hello,${this.filedName}`)
}
}
new User().sayHi()
1対象向けプログラミングの最も重要な原則の一つである外部インターフェースから内部インターフェースを区分することは、属性と方法に関するアクセス可能範囲2は対象向けプログラミングにおいて、prvate protected publicによって、クラスの属性と方法を制限することができます.例えば、あなたはお父さんからいくつかの属性を継承しました.しかし、あなたのお父さんはいくつかの属性を継承していますが、お父さんの他の属性はあなたに継承されたくないです.javascriptで保護された属性と方法は何ですか?最初の私有の属性と方法名は、萼頭4を対象にプログラミングした大きな利点の一つです.内部実装を理解する必要はなく、依然としてよくプログラミング開発ができます.