导图社区 Js
:js一般指JavaScript。 JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中
编辑于2022-06-14 21:50:40js
函数对象
什么是
为什么、何时
代码重用
如何使用
创建
funcation(函数名,参数列表){函数体;return 返回值}
变量声明,可变量提前
以函数直接量
var 函数名=function(参数列表){函数体}
子主题
实例化对象
var 函数名=new function(“参数1”,“参数2”,“函数体和返回值”)
调用
var 返回值=函数名(参数值列表)
参数值列表的顺序和个数,和创建函数是的参数列表一致
返回值可省略
按值传递
将变量作为参数传入函数时,其实是将变量中的值复制给函数的参数
原始类型
子主题
引用类型
子主题
重载(overload)
本意
相同函数名不同参数列表的多个函数,在调用时可自动根据传入参数的不同,动态选择对应的函数调用,执行不同任务
JS语法不支持重载
变通
使用arguments对象
什么是
每个函数中,自动创建的接收所有传入参数值的类数组对象
类数组对象
长得像数组的对象
可用下标遍历
有length属性
遍历
只能用for循环
vs数组
不能直接使用数组的API
可将类数组对象转为普通数组
var arr=Array.prototype.slice
何时使用
在重载是模拟
如何使用
根据arguments的length属性判断传入的参数个数,执行不同的操作
使用arguments[i]获取每个参数的值
为什么
功能相近的函数,本应起相同的名字,可以减少调用者的负担
匿名函数
什么是
创建时没有任何变量引用的函数
为什么
节约内存空间
因为没有变量引用,调用完成后立刻释放
何时
如果一个函数只用一次,不会重用,就要用匿名函数定义
如何使用
function(参数列表){函数体,return 返回值;}(参数值列表)
自调
定义后立刻执行
回调
将函数交给其他对象调用
定时器
作用域与作用域链
作用域:一个变量的可用范围
一个变量的实际存储位置
全局对象
全局作用域
全局变量
在任何位置都可访问,可重复访问
函数调用时的AO活动对象中
函数作用域
局部变量
随函数创建而创建,只能在本次调用使用,使用后随AO释放而释放,不可重复使用
作用域链:以当前函数的EC中scope chain属性为起点,经过AO,到window对象结束,形成的继承关系链
在调用函数时,函数会优先使用局部变量,如果没有,会沿着作用域链向上查找,如果整条作用域链找不到,就会报错
闭包
什么是闭包
保护局部变量的语法结构
为什么
全局变量
优点:可重复使用
缺点:容易受到污染
局部变量
优点:只能在函数内访问,不会被污染
缺点:不能重复使用
综合两者优点,只能用闭包结构
如何使用
三特点
外层函数包裹一个受保护的局部变量和专门操作变量的内层函数
内层函数使用了外层函数保护的局部变量
外层函数将内层函数返回到外部,被外部变量获取并重用
笔试如何快速判断
外层函数调用几次,就有几个受保护的局部变量副本
同一次外层函数调用,返回的多个函数,使用同一个局部变量副本
判断谁是受保护的局部变量
js中关于闭包的题目,练习 判断一个对象是否是数组有几种办法 下载web1511A中JS第十天课程(es5),重点:对象的属性,属性的特性,对象的create方法,数组API(使用方法,查找API的源代码,map函数实现原理) 函数的bind方法,能够编写源代码 严格模式
面向对象
对象
描述现实中一个具体事物的属性和功能的结构
同时保存多个属性和方法的存储空间
面向对象
程序中,描述现实中的一个事物,都要先将事物的属性和功能定义在一个对象中
在程序执行时,都是调用对象的功能,来操作对象的属性
封装
将多个数据和方法直接定义在一个对象中
创建对象(自定义对象)
只创建一个对象
直接量
var object{属性:值,方法:function(){};}
js中一切都是对象,底层都是关联数组
对象可随时向对象中添加新的属性和方法
子主题
方法也是属性
属性用量存具体值,方法是引用一个函数对象的特殊属性
用实例化对象
new可以省略
object()构造函数在接到无效参数时都会返回新对象
var obj=new(Obj)obj.属性=值
反复创建多个相同结构的函数
构造函数
什么是
专门为一个空对象添加新属性和方法的函数
为什么
为了反复创建多个相同结构的对象
使用
先定义构造函数
function 类型名(属性参数列表)
调用构造函数创建新对象
var obj=new 构造函数名(属性值列表)
new
创建一个空对象
使用空对象调用构造函数
new可将构造函数中的this指向新对象
构建子对象的__proto__属性指向构造函数的原型对象
this
EC中,引用调用函数的当前对象的属性
判断
this和定义在哪无关
只和调用时使用的对象有关
调用函数时.之前的对象
没有用对象.的方式调用,this默认指window
遍历对象所有属性
面向对象的三大特点
封装
继承
父对象的成员,子对象可直接使用
为何
实现成员的代码重用
多态
同一个事物在不同情况下表现出不同的状态
重载
重写(override)
子对象继承来的成员不好用,可在子对象本地定义同名成员
子对象会优先使用自己定义的成员
为何重写
为了实现子对象和父对象之间的差异性
继承
原型对象
专门保存所有子对象共有成员的对象
何时使用
子对象共有的成员值,都要保存在原型对象中一份
为何使用
代码重用,数据重用,便于维护
如何使用
访问
每个构造函数中都有一个prototype属性,指向当前构造函数的原型对象
构造函数.prototype
默认原型对象中是空的
通过每个子对象的__proto__也可获得构造函数的原型对象
子对象.__proto__
Object.getProtoOf(子对象)
如何向原型对象中添加共有成员
构造函数.prototype.成员名=属性值
错误:子对象.共有成员=值
不允许子对象修改父对象
实际会在子对象创建同名成员覆盖父对象成员
访问原型对象中的成员
子对象.共有成员名
子主题
原型链
从子对象为起点,由每级父对象的__proto__组成的多级继承关系
原型链的顶点object.prototype对象
所有函数对象的父级都是function.prototype
function.prototype的父级对象是obj.prototype
自有属性和共有属性
自有属性
直接保存在对象本地的成员
只归当前对象所有
如何判断
obj.hasOwnProperty(“成员名”)
如果指定成员保存在本地,返回true
如果没有,返回false
共有属性
从原型链上继承的成员
所有子对象共同所有
判断
不是自有属性,且在原型链上有
删除属性
只能删除自有属性,不能删除共有属性
修改继承关系
仅修改单个对象的父对象
当前对象.__proto__=父对象
可能不允许访问
Object.setPrototypeOf(当前对象,父对象)
通过修改构造函数的原型对象,实现修改所有子对象的父对象
构造函数.prototype=父对象
时机:必须在创建所有对象之前就修改好
实现两种类型间的继承(最想JAVA中的继承)
继承同时扩展,既继承原型也继承结构
子类型构造函数中,先调用父类型构造函数
call和apply方法
在调用函数时,临时更换函数中的this为指定对象
何时使用
只要调用函数时,this不是想要的,就可使用call和apply临时更换
差别
call要求,所有参数单独传入,用逗号分开
apply要求所有参数作为数组传入
function 子类型构造函数(参数列表){ 父类型构造函数.apply(this,argument) 其他扩展属性 }
修改子类型的原型对象prototype继承父类型的原型
Object.setPrototypeOf(子类型原型对象,父类型原型对象)