文章目录
一、JavaScript对象
对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性
对象的分类:1.内置对象
由ES标准中定义的对象,在任何的ES的实现中都可以使用
2.宿主对象
由JS的运行环境提供的对象,目前来讲主要指由浏览器提供的对象
如: BOM DOM
3.自定义对象
由开发人员自己创建的对象
创建对象
var obj = new Object(); //var 对象名 = new Object()
使用new关键字调用的函数,是构造函数constructor,构造函数是专门用于创建对象的函数
添加属性
在对象中保存的值成为属性
obj.name = "zby"; //对象.属性名 = 属性值
obj["123"] = 789; //对象["属性名"] = 属性值
属性名不强制要求遵守标识符规范,但是使用特殊的属性名时只能采用对象["属性名"] = 属性值
的声明方式
在[ ]中可以直接传递一个变量,这样变量值是多少就读取哪个属性
读取属性
obj.name; //对象.属性名
读取对象中没有的属性,不会报错,会返回undefined
obj["123"];//对象["属性名"]
in运算符:检查一个对象及其原型中是否含有指定的属性
如果有则返回true,否则返回false
"name" in obj; //"属性名" in 对象
hasOwnProperty()
检查对象自身中是否含有该属性
修改属性
obj.name = "tom" //对象.属性名 = 新值
删除属性
delete obj.name //delete 对象.属性名
对象字面量
用于创建对象var obj = {};
使用对象字面量时可以在创建对象时,直接指定对象中的属性
var obj = {name:"zby"}; //var 对象={属性名:属性值,属性名:属性值……}
二、JavaScript函数
函数也是一个对象,可以封装一些功能(代码),在需要时可以执行这些功能(代码)
创建函数
-
函数对象
var fun = new Function();
使用typeof检查函数对象时,会返回function -
函数声明
function 函数名([形参1,形参2……]){ 语句; }
-
函数表达式
var 函数名 = function([形参1,形参2……]){ 语句; }
调用函数
fun(); //函数对象()
调用函数时,函数中封装的代码会按照顺序执行,使用函数的返回值
调用函数时解析器不会检查实参的类型
也不会检查实参的数量,多余实参不会被赋值。
break->退出当前的循环
continue–>跳过当次循环
return–>结束整个函数
立即执行函数
(function(形参1.形参2……){ 语句; })(实参1,实参2……)
函数定义后,立即被调用,往往只会执行一次
三、JavaScript方法
如果一个函数作为一个对象的属性保存,我们则称这个函数是这个对象的方法。
调用函数就说是调用对象的方法(只是名称上的区别,实质上没有区别)
var obj = new Object(); obj.name="zby"; obj.sayName = function(){ console.log(obj.name); } obj.name(); //调方法
function fun(){ console.log(obj.name); } fun(); //调函数
使用for in语句,枚举对象中的属性
for (var 变量 in 对象){ }
每次执行时,将对象中的一个属性是名称赋值给变。
四、JavaScript作用域
作用域:一个变量作用的范围
全局作用域
-
直接编写在script标签中的js代码,都在全局作用域中。
-
全局作用域在页面打开时创建,在页面关闭时销毁。在页面任意部分都可以访问的到
-
在全局作用域中有全局对象window,可以直接使用。
window代表浏览器的窗口,由浏览器创建。 -
在全局作用域中,创建的变量都会作为window对象的属性保存
创建的函数都会作为window对象的方法保存 -
变量的声明提前:使用var关键字声明的变量,会在所有代码执行之前被声明
-
函数的声明提前:使用函数声明形式创建会在所有代码执行之前就被创建
函数function函数(){}
函数作用域
- 调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁
- 每调用一次函数就会创建一个新的函数作用域,他们之间相互独立
- 在函数作用域中可以访问到全局作用域的变量,在全局作用域中无法访问到函数作用域的变量
- 在函数作用域操作一个变量时,先在自身作用域中寻找,若是没有则在上一级作用域中寻找,若全局作用域中仍未找到则报错ReferenceError
- 在函数中访问全局变量可以使用window对象
- 全局作用域中适用的变量的提前声明和函数的提前声明在函数作用域中仍适用
- 函数中不使用var声明的变量都会变为全局变量
五、this
解析器在调用函数每次都向函数内部传递一个隐含参数this
- this指向一个对象,这个对象是函数执行的上下文对象
- 根据函数的调用方式不同,this指向不同的对象
- 以函数形式调用时,this永远都是window
- 以方法形式调用时,this就是调用方法所对应的对象
- 以构造函数形式调用时,this就是新创建的那个对象
六、构造函数
- 构造函数就是一个普通的函数,创建方式和普通函数没有区别
- 构造函数习惯上首字母大写
- 普通函数是直接调用,构造函数需要使用new关键字调用
function Person(){ } var per = new Person(); //构造函数调用 var per0 = Person(); //普通函数调用
构造函数执行流程:
- 立刻创建一个新的对象
- 将新建的对象设置为函数中的this,在构造函数中可以使用this引用新建的对象
- 逐行执行函数中的代码
- 将新建的对象作为返回值返回
使用同一个构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类。我们将通过一个构造函数创建的对象,称为是该类的实例。
使用instanceof可以检擦一个对象是否是一个类的实例
对象 instanceof 构造函数 //是返回true;否返回false
七、原型prototype
解析器会向每个函数中添加一个属性prototype,prototype属性对应着一个对象,这个对象就是我们所谓的原型对象。
原型对象就相当于一个公共区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对象中共有的内容,统一设置到原型对象中。
当我们访问对象的一个属性或方法时,先在对象自身中寻找,如果没有则去原型对象中寻找。
当函数作为普通函数调用时,没有任何作用
当函数作为构造函数调用时,她所创建的对象中都会有一个隐含的属性
指向该构造函数的原型对象,我们可以通过__proto__
来访问该属性
function MyClass(){ } MyClass.prototype.a = 123; var mc = new MyClass(); console.log(MyClass.prototype == mc.__proto__) //true