Open vaakian opened 2 years ago
讨论class写的属性到底是在实例本身上面,还是在原型链上?
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定义的方法是原型方法,实际上是在原型链上,可以被实例之间共享。
greet1
greet2
=
写法2
讨论
class
写的属性到底是在实例本身上面,还是在原型链上?以上例子可知,
greet1
属于实例方法,greet2
属于原型方法。总的来说就是用=
号赋值的属性/方法,都属于实例属性/方法。 用写法2
定义的方法是原型方法,实际上是在原型链上,可以被实例之间共享。