引言
今天同学发来一道js面试题,然后,,,我错的一塌糊涂,遂决定深入总结一下js函数的私有、静态、实例、原型方法和属性
内容
直接上代码
function Foo(name) {
let age = 25 // 私有属性
function sex() { // 私有方法
console.log('male')
}
this.name = name // 实例属性
this.run = function() { // 实例方法
console.log('run')
}
}
Foo.home = 'Beijing' // 静态属性
Foo.talk = function() { // 静态方法
console.log('talk')
}
Foo.prototype.height = 180 // 原型属性
Foo.prototype.swim = function() { // 原型方法
console.log('swim')
}
// class语法糖
class Foo {
constructor(name) {
this.name = name; // 实例属性
this.run = function() { // 实例方法
console.log('run')
}
}
static home = 'Beijing'; // 静态属性
static talk() { // 静态方法
console.log('talk')
}
id = '78979'; // 实例属性,注意!!
swim() { // 原型方法
console.log('swim')
}
}
- 函数的私有属性和方法在函数体外部是不能直接通过属性访问符
.访问的,如果要访问,可以使用闭包 - 函数的静态属性和方法可以在函数体外部直接访问,例如Object.is()
- 函数的实例属性和方法是绑定到函数返回的实例上的,当然,函数得作为构造函数使用
new调用 - 函数的原型属性和方法是挂在函数的原型对象上的,实例的原型对象会关联到函数的原型对象,当访问实例的属性和方法时,如果实例上找不到,会通过原型委托到函数的原型上。但是,当直接访问函数的静态属性和方法时,如果找不到,不会去函数的原型上查找
结语
注意把私有属性和静态属性区分开,把实例属性和原型属性区分开。