对象
-
对象的分类
- 内建对象 由ES标准中定义的对象
- 例如:Math String Number Boolean Function Object
- 宿主对象 由JS的运行环境提供的对象
- BOM DOM
- 自定义对象 由开发人员自己创建的对象
- 内建对象 由ES标准中定义的对象
-
创建对象
- var obj = new Object();
- var obj = {};
-
向对象中添加属性
- 对象名.属性名=属性值;
- 对象名[“属性名”]=属性值;
- 使用对象字面量,在创建对象时直接向对象中添加属性
- var obj = {
属性名:属性值,
属性名:属性值,
属性名:属性值,
属性名:属性值
}
- var obj = {
- 对象的属性名没有任何要求,不需要遵守标识符的规范,尽量按照标识符的要求去写。
- 属性值也可以任意的数据类型。
-
读取对象属性
- 对象.属性名
- 对象[属性名]
- 读取一个对象中没有的属性,它不会报错,而是返回一个undefined
-
删除对象中的属性
- delete 对象.属性名
- delete 对象[“属性名”]
-
使用in检查对象中是否含有指定属性
- “属性名” in 对象
- 如果在对象中含有该属性,则返回true,如果没有则返回false
-
值传递机制:基本数据类型赋值时传递的是值,引用类型赋值时传递的是地址
函数
- 函数 也是一个对象,也具有普通对象的功能
- 使用typeof检查一个函数时会返回function
- 创建函数
- 函数声明
function 函数名([形参1,形参2…形参N]){
语句…
} - 函数表达式
var 函数名 = function([形参1,形参2…形参N]){
语句…
};
- 函数声明
- 调用函数
- 函数对象([实参1,实参2…实参N]);,例如alert() Number() parseInt()
- 如果实参的数量大于形参,多余实参将不会赋值
- 如果实参的数量小于形参,则没有对应实参的形参将会赋值undefined
- 返回值:
- 使用return 来设置函数的返回值
- return后可以跟任意类型的值,可以是基本数据类型,也可以是一个对象
- 方法:当一个对象的属性是一个函数时,便为该对象的方法
- 对象.方法名();
- 函数名()
- 作用域
- 全局作用域
- 直接在script标签中编写的代码
- 在打开页面时创建,在页面关闭时销毁
- 有一个全局对象window,由浏览器提供
- 在全局作用域中创建的变量都会作为window对象的属性保存
- 在全局作用域中创建的函数都会作为window对象的方法保存
- 在函数作用域中也可以访问到全局作用域的变量
- 函数作用域
- 在函数体内创建的变量
- 在函数作用域中创建的变量,不能在全局中访问
- 当在函数作用域中使用一个变量时,它会先在自身作用域中寻找,
- 如果找到了则直接使用,如果没有找到则到上一级作用域中寻找。
- 变量的声明提前
- 在全局作用域中
- 使用var关键字声明的变量会在所有的代码执行之前被声明,但是不会赋值。
- 不使用var关键字声明的变量不会被声明提前
- 在函数作用域中
- 使用var关键字声明的变量会在函数所有的代码执行前被声明
- 没有使用var关键字声明变量,则变量会变成全局变量
- 在全局作用域中
- 函数的声明提前
- 在全局作用域中
- 使用函数声明创建的函数(function fun(){}),会在所有的代码执行之前被创建,
- 使用函数表达式(var fun = function(){})创建的函数没有该特性
- 在函数作用域中
- 使用函数声明创建的函数,会在所有的函数中的代码执行之前就被创建好了
- 在全局作用域中
- 全局作用域
- this 函数的上下文对象,谁调用这个函数,this就指代的哪个对象
- arguments 封装实参的对象,类数组对象
- arguments.length 可以获取实参的长度
- arguments[0] 表示第一个实参
- arguments.callee 表示当前正在指向的函数对象
- 构造函数
-
专门用来创建对象的函数,也可以称为一个类
-
例子
function Person(){}
-
构造函数的执行过程
- 创建一个新的对象
- 将新的对象作为函数的上下文对象(this)
- 执行函数中的代码
- 将新建的对象返回
-
- instanceof 用来检查一个对象是否是一个类的实例
- Object是所有对象的祖先,所以任何对象和Object做instanceof都会返回true
- 枚举对象中的属性,遍历,可通过它获得对象的属性
-
语法:
for(var 属性名 in 对象){}
-
- 原型对象
- 创建一个函数以后,解析器都会默认在函数中添加一个数prototype
- prototype属性指向的是一个对象,这个对象我们称为原型对象
- 当函数作为构造函数使用,它所创建的对象中都会有一个隐含的属性执行该原型对象。
- 这个隐含的属性可以通过对象.__proto__来访问
- 凡是通过同一个构造函数创建的对象他们通常都可以访问到相同的原型对象
- 可以将对象中共有的属性和方法统一添加到原型对象中
- 当我们去访问对象的一个属性或调用对象的一个方法时,它会先自身中寻找
- 如果在自身中找到了,则直接使用。
- 如果没有找到,则去原型对象中寻找,如果找到了则使用
- 如果没有找到,则去原型的原型中寻找,依此类推。直到找到Object的原型为止
- hasOwnProperty()
- 这个方法可以用来检查对象自身中是否含有某个属性
- 语法:对象.hasOwnProperty(“属性名”)
- 创建一个函数以后,解析器都会默认在函数中添加一个数prototype
- call()和apply()方法
- 函数对象的方法
- 可将对象作为参数传递,所传递的对象便是函数执行时的this,即指定this对象
- call和apply的区别:call可依次传递对象参数,apply则需将实参封装到一个数组中传递