構造関数とclassの関連と区別
2318 ワード
function Person(name) {
this.name = name
this.sayName = function() {
console.log(this.name)
}
}
const p1 = new Person(' ')
const p2 = new Person(' ')
p1.sayName() //
p2.sayName() //
console.log(p1.sayName === p2.sayName) //false
console.log(Person.prototype)
/*
* {constructor: ƒ}
* constructor: ƒ Person(name)
* __proto__: Object
*
* */
上記の印刷結果から、インスタンスを作成するたびにsayName関数が再作成され、実行するとパフォーマンスが低下することがわかります.
class Student {
constructor(name) {
this.name = name
}
sayName() {
console.log(this.name)
}
}
const p3 = new Student(' ')
const p4 = new Student(' ')
p3.sayName() //
p4.sayName() //
console.log(p3.sayName === p4.sayName) // true
console.log(Student.prototype)
/*
*{constructor: ƒ, sayName: ƒ}
constructor: ƒ Student(name),
sayName: ƒ sayName(),
__proto__: Object
*/
ここで、クラスの関数はprototypeに作成され、各インスタンスのsyaNameメソッドは同じアドレス、すなわち同じメソッドを指し、構造関数に比べてパフォーマンスが向上することがわかります.
次は両者の類似点です.これはインスタンスを指しています
function Person(name) {
this.name = name
this.sayName = function() {
console.log(this)
}
this.sayHello = function() {
const check = this.sayName
check()
}
}
const p1 = new Person(' ')
const p2 = new Person(' ')
p1.sayName() // Person {name: " ", sayName: ƒ, sayHello: ƒ}
p2.sayName() // Person {name: " ", sayName: ƒ, sayHello: ƒ}
p1.sayHello() // undefiend
class Student {
constructor(name) {
this.name = name
}
sayName() {
console.log(this)
}
sayHello() {
const checkThis = this.sayName
checkThis()
}
sayBind() {
const checkThisBind = this.sayName.bind(this)
checkThisBind()
}
}
const p5 = new Student(' ')
const p6 = new Student(' ')
p5.sayName() // Student {name: " "}
p6.sayName() // Student {name: " "}
p5.sayHello() // undefiend react this
p5.sayBind() // Student {name: " "}