在调用位置中,是通过某个对象发起函数的调用
JavaScript中的函数可以当做一个类的构造函数来使用,也就是使用new关键字.
补充:
注意:JavaScript所有的函数都可以使用call和apply方法:
第一个传入参数都是相同的,要求传入一个对象,通过直接绑定了this的指向对象,称作显示绑定
如果我们希望一个函数总是显示的绑定到一个对象上,可以使用bind方法。bind() 方法创建一个新的绑定函数。在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用
箭头函数是ES6之后增加的一种编写函数的方法,并且它比函数表达式更要简洁
- 箭头函数不会绑定this、arguments属性;(this引用就会从上层作用域中找到对应的this)
- 箭头函数不能作为构造函数来使用(不能和new一起来使用,会抛出错误。箭头函数中没有原型);
注意:如果函数执行体只有返回一个对象, 那么需要给这个对象加上()
关于Map
Map
对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者[基本类型)都可以作为一个键或一个值。Object
和 Map
类似的是,它们都允许你按键存取一个值、删除键、检测一个键是否绑定了值。
Array.prototype.map()中的的map()
方法创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成。
事实上在函数有一个特别的对象:arguments对象
方式一:遍历arguments,添加到一个新数组中
方式二:ES6中常用的两个方法:
注意:箭头函数是不绑定arguments的,所以我们在箭头函数中使用arguments会去上层作用域查找
如果最后一个参数是 … 为前缀的,那么它会将剩余的参数放到该参数中,并且作为一个数组;
那么剩余参数和arguments有什么区别呢?
在程序设计中,若一个函数符合以下条件,那么这个函数被称为纯函数(维基百科):
总结:
①确定的输入,一定会产生确定的输出;
②函数在执行过程中,不能产生副作用;
例子(slice和splice):
- slice截取数组时不会对原数组进行任何操作,而是生成一个新的数组;
- splice截取数组, 会返回一个新的数组, 也会对原数组进行修改;
- slice就是一个纯函数,不会修改数组本身,而splice函数不是一个纯函数;
副作用: 表示在执行一个函数时,除了返回函数值之外,还对调用函数产生了附加的影响, 比如修改了全局变量,修改参数或者改变外部的存储;
只传递给函数一部分参数来调用它,让它返回一个函数去处理剩余的参数,这个过程就称之为柯里化;
JavaScript当中每个对象都有一个特殊的内置属性 [[prototype]],这个特殊的对象可以指向另外一个对象。获取方式有两张:
疑问:这个原型有什么用呢?
当我们通过[get]方式获取一个属性对应的value时–>它会优先在自己的对象中查找,如果找到直接返回–>如果没有找到,那么会在原型对象中找。
注意: 所有的函数都有一个prototype
的属性(不是__proto__
)。因为它是一个函数,所有拥有了prototype属性,obj就没有这个属性。
作用:在通过new操作创建对象时,将这个显示原型赋值给创建出来对象的隐式原型。可以避免重复创建函数,造成空间浪费。
每创建一个函数, 就会同时创建它的prototype对象, 这个对象也会自动获取constructor属性;
如果我们重写整个原型对象,相当于给prototype重新赋值了一个对象, 那么这个新对象的constructor属性, 会指向Object构造函数, 而不是原本的构造函数。
面向对象有三大特性:封装、继承、多态 封装:
- 我们前面将属性和方法封装到一个类中,可以称之为封装的过程;
- 继承:继承是面向对象中非常重要的,不仅仅可以减少重复代码的数量,也是多态前提(纯面向对象中)。继承可以帮助我们将重复的代码和逻辑抽取到父类中,子类只需要直接继承过来即可
- 多态:不同的对象在执行时表现出不同的形态;
在子类型构造函数的内部调用父类型构造函数:
核心:创建一个对象,使子类显示原型指向这个对象,并且对象的隐式原型指向父类的显示原型
类方法:指直接添加在构造函数的对象本身的方法
实例方法:是指添加在构造函数的对象原型上的方法
2022.07.07