JS的实例方法和静态方法
程序员文章站
2024-02-20 15:40:58
...
今天看到一道面试题,题目是这样的:
问如下输出是什么?
class Fun () {
static changeColor (newColor) {
this.color = newColor
}
constructor ({newColor: 'blue'}) {
this.color = newColor
}
}
const stm = new Fun({newColor: 'yellow'})
stm.changeColor('red')
首先我们来理解一下静态方法和动态方法:
静态方法:在构造函数本身上定义的方法,只能通过构造函数本身调用,new出来的对象不能够调用。
静态方法直接用类名.方法名去调用。
动态方法:也叫做实例方法,它是通过prototype原型对象添加的,所有的实例对象都能够继承调用。通过先定义一个引用变量,指向构造函数定义的新对象,数对象中的属性 prototype可以想成一个指针,指向一个方法。
class Star {
constructor (name) {
this.name = name
}
sing=function(){
console.log('I can sing.')
}
}
Star.dance = function() {
console.log('I can dance.')
}
Star.prototype.getName = function(name){
console.log('My name is ' + name);
}
Star.dance() // I can dance.
Star.sing() // Uncaught TypeError: Star.sing is not a function
Star.getName('ldh') // Uncaught TypeError: Star.getName is not a function
var ldh = new Star()
ldh.dance() // ldh.dance is not a function
ldh.sing() // I can sing.
ldh.getName('ldh') // My name is ldh
定义一个ldh的实例对象,发现sing方法和getName方法都可以调用,而dance方法不行,
输出Star.prototype看一下:
{getName: ƒ, constructor: ƒ, sing: ƒ}
getName: ƒ (name)
constructor: class Star
sing: ƒ sing()
__proto__: Object
发现sing和getName方法都在Star.prototype上面,那么我们就发现了,prototype上面的方法,只有在创建一个实例的情况下,才可以通过实例进行访问。
dance这个方法是定义在类上面的,所以它实际上是一个静态方法,静态方法是可以直接通过类进行访问的(这里的静态方法都是public的),而实例不能访问
以上,我们就可以知道上面那个题的答案是:TypeError ,stm是Fun的实例对象,changeColor是类的静态方法,实例对象不可以访问类的静态方法。
下一篇: SVN常用操作命令