js函数的私有属性和方法、静态属性和方法、实例属性和方法、原型属性和方法

1,779 阅读1分钟

引言

今天同学发来一道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调用
  • 函数的原型属性和方法是挂在函数的原型对象上的,实例的原型对象会关联到函数的原型对象,当访问实例的属性和方法时,如果实例上找不到,会通过原型委托到函数的原型上。但是,当直接访问函数的静态属性和方法时,如果找不到,不会去函数的原型上查找

结语

注意把私有属性和静态属性区分开,把实例属性和原型属性区分开。