1

再记面向对象

函数和对象的联系

先理一下函数的功能:

  1. 创建:可以通过字面量创建
  2. 可以赋值给变量、数组作为成员和其他的对象作为属性
  3. 作为函数的参数
  4. 作为返回值
  5. 自身可以添加属性

在上面列出的函数功能对象皆具有

详细函数介绍

为什么介绍函数?

因为闭包、面向对象都需要与其有关,并且函数对于JavaScript的重要性则是无与伦比

函数创建的几种方法:

  • 函数定义: 函数声明和函数表达式(回调函数与其关系)
  • 箭头函数: es6增加(注意箭头函数的this)
  • 函数构造函数:new function ('a','b','return a+b');
  • 生成器函数:
  1. 函数声明和函数表达式

    函数声明:

    • 函数声明用function 开头,并且函数名为强制存在,参数名可选,函数体用大括号{}包起来。
    function square(number) {
        return number * number;
        }

注意函数名必须存在,这样才可以被其他地方进行调用。函数可以在函数里声明 ,[闭包]()与此有关。

函数表达式:

  • 函数表达式则是可以被用来作为参数、作为返回值。可以快速的被创建使用。

    var fn = function() {
      console.log("hello world")
    }
    
    fn()
    
    function outPut (callback) {
      callback()
    }
    
    outPut(fn)

    函数名不是必须的

  1. 箭头函数

    function getName (name) {
      return (function(j) {
       return j
      })(name)
    }
    
    var showName = getName("kangkang")
    
    console.log(showName)
    

    下面改写为箭头函数形式

    function getName (name) {
      return (j=>j)(name)
    }
    
    var showName = getName("kangkang")
    
    console.log(showName)
    

遵循 参数=>被返回的表达式的值(p,b)=>p+b相当于function(p,b){return p+b},也可以使用代码块进行必要的操作,此时需要显示表明return的值。

调用函数:

  • 函数的调用,定义一个函数并不会执行它,需要调用。在调用时,你需要给定可选的参数,如果参数为空则无需给定。函数声明的提升可以让函数不在顶层被声明。

    一个需要注意的地方 函数提升仅适用于函数声明,而不适用于函数表达式。

  • 具体函数的调用在this上的改变令人捉摸不透,我也写了篇笔记 [this何时为何值?]()待添加

原型链:

每个对象(函数)具有一个原型属性,指向可以被实例共享的属性和方法。而原型链在寻找某个属性时体现的比较清楚:

function one () {
  this.value = 1
}
one.prototype.output = function() {
  console.log(this.value)
}

function two () {
  this.value = 2
}

function three () {
  this.value = 3
}

two.prototype = Object.create(one.prototype)
three.prototype = Object.create(two.prototype)

var one1 = new one()
var two1 = new two()
var three1 = new three()

three1.output()
// 对于three1来说并没有output这个方法,就是通过原型链这个链进行一层一层寻找的

重写对象原型引起的问题

  • 在构造函数创建新的实例后依然可以添加新的原型属性和方法并且可以被访问到,但是如果重写整个原型对象的话,就需要注意了。实例对象与构造函数的原型联系是在创建实例时确定的,当创建后更改原型对象并不改变之前创建的实例所关联的原型对象,新创建的使用新的原型对象。

  • constructor属性指向创建实例的函数

个人学习备忘,如有谬误,欢迎指正。


戴西西
7 声望1 粉丝