1、对象拷贝
面向对象的特点:封装,继承,多态(抽象)
// 封装继承函数
function extend (parent, child) {
for (var k in parent) {
// 子级有的属性不需要继承
if (child){
continue;
}
child[k] = parent[k];
}
}
extend(parent, child);
对象拷贝:for……in 父对象的属性拷贝给子对象
2、call 方法
函数本身就是一种对象,就能够有自己的属性和方法
call 方法本身是一种执行函数的方法,call 方法调用函数的时候,
有两个功能:1.更改函数内部的 this 的指向;2. 调用函数执行内部代码
参数: 第一个参数用来指定 this ;第二个及以后就是传的实参
3、借用构造函数继承属性
直接对父类型的构造函数进行一个普通调用;Person 普通调用过程中,内部的this指向的是 window;可以通过call 方法更改Person 内部的 this Person.call(this, name, age, sex);
4、构造函数方法的继承
子类型的原型对象上,需要继承父类型原型对象的方法
方法一、对象拷贝继承
for(var k in Person.prototype) {
// 保留自己的 constructor 不要进行继承
if(k === "constructor"){
continue;
}
Student.prototype[k] = Person.prototype[k];
}
方法二、原型继承:Student.prototype = new Person();Student.prototype.constructor = Student;
5、组合继承:属性再构造函数内部继承,方法通过原型继承
6、函数声明与函数表达式的区别
函数声明必须有名字
函数声明会函数提升,在预解析阶段就已创建,声明前后都可以调用
函数表达式类似于变量赋值
函数表达式可以没有名字,例如匿名函数
函数表达式没有函数提升,在执行阶段创建,必须在表达式执行之后才可以调用
7、函数也是对象
函数本身也是一种对象,可以调用属性和方法
8、函数的调用和默认 this
1.普通的函数,是通过 给函数命名或者变量名加 () 方式执行;内部的 this 默认指向 window
2.构造函数,是通过 new 关键字进行调用;内部的 this 指向的是将来创建的实例对象
3.对象中的方法,是通过对象打点调用函数,然后加小括号;内部的 this 默认指向的是调用的对象自己
4.事件函数,不需要加特殊符号,只要事件被触发,会自动执行函数;内部的 this指向的是事件源
5.定时器和延时器中的函数,不需要加特殊符号,只要执行后,在规定的时间自动执行;内部的 this 指向的是 window
9、call、apply、bind
call 方法
call() 方法调用一个函数,其具有一个指定的 this 值和分别地提供的参数(参数列表)。
注意:该方法的作用和apply()方法类似,只有一个区别,就是 call() 方法接受的是若干个参数的列表,而 apply() 方法接受的是一个包含多个参数的数组。
语法:fun.call(thisArg, arg1, arg2, ...)
thisArg 在fun函数运行时指定的 this 值;如果指定了 null 或者 undefined 则内部 this 指向 window
arg1, arg2,... 指定的参数列表
返回值:就是函数自己的返回值
apply 方法
apply() 方法调用一个函数,其具有一个指定的 this 值和分别地提供的参数(参数列表)。
注意:该方法的作用和call()方法类似,只有一个区别,就是 call() 方法接受的是若干个参数的列表,而 apply() 方法接受的是一个包含多个参数的数组。
语法:fun.apply(thisArg, [argArray])
thisArg 在fun函数运行时指定的 this 值;如果指定了 null 或者 undefined 则内部 this 指向 window
argArray 指定的参数数组
返回值:就是函数自己的返回值
bind 方法
bind() 功能:第一个可以指定函数的 this 值,bind 方法不能执行函数,但是可以传参
参数:第一个参数,传入一个指定让 this 指向的对象,第二个参数及以后,是函数参数的列表
返回值:返回一个新的指定了 this 的函数,也可以叫绑定函数
10、函数的其他成员
arguments 存储的是函数在调用时,传入的所有 实参 组成的一个类数组对象
arguments.callee 是函数本身,一般直接调用就可以,不需要这个
fn.caller 函数的调用者,函数在哪个作用域调用, caller 就是谁,如果在全局调用,值就是 null
fn.length 指的是形参的个数
fn.name 函数的名字
11、高阶函数
函数可以作为参数;函数可以作为返回值
12、什么是闭包
一个函数和对其周围状态 (lexical environment,语法环境) 的引用捆绑在一起 (或者说函数被引用包围),这样的组合就是闭包 (closure)。 也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。
闭包 函数定义时天生就能记住自己生成的作用域环境和函数自己,将它们形成一个密闭的环境,这就是闭包。不论函数以任何方式在任何地方进行调用,都会回到自己定义时的密闭环境进行执行。
观察闭包 从广义上来说,定义在全局的函数也是一个闭包,只是我们没办法将这样的函数拿到更外面的作用域进行调用,从而观察闭包的特点; 闭包是天生存在的,不需要额外的结构,但是我们为了方便观察闭包的特点,需要利用一些特殊结构将一个父函数内部的子函数拿到父函数外部进行调用,从而观察闭包的存在
闭包的用途 可以在函数外部读取函数内部的成员;让函数内部成员始终存活在内存中
在拉钩学习的笔记(九)函数继承和进阶
最新推荐文章于 2024-09-17 13:42:29 发布