vaakian / vaakian.github.io

some notes
https://vaakian.github.io
3 stars 0 forks source link

class属性/方法分析 #35

Open vaakian opened 2 years ago

vaakian commented 2 years ago

讨论class写的属性到底是在实例本身上面,还是在原型链上?

class Person {
    // 属性是自身属性
    age = 22
    constructor(age) {
        this.age = age
        // 构造函数内赋值,肯定是自身属性
        // this.greet = function greet() {
        //     console.log(this.age)
        // }
    }
    // 写法1:方法是自身方法,在实例本身上,与构造函数内赋值一样的效果
    greet1 = function () {
        console.log(this.age)
    }
    // 写法2:方法是共享方法,在原型链上
    greet2() {
        console.log(this.age)
    }
}

let p1 = new Person(23)
let p2 = new Person(24)

// true说明是原型链上的方法 
console.log(p1.greet1 === p2.greet1) 'false'
console.log(p1.greet2 === p2.greet2) 'true'

// 检查原型链上有没有该方法
console.log(p1.__proto__.greet1) 'undefined'
console.log(p1.__proto__.greet2) '[Function: greet1]'

// age属性在原型链上
console.log(p1.age) '23'
console.log(p1.__proto__.age) 'undefined'

以上例子可知,greet1属于实例方法,greet2属于原型方法。总的来说就是用=号赋值的属性/方法,都属于实例属性/方法。 用写法2定义的方法是原型方法,实际上是在原型链上,可以被实例之间共享。