对象
概念
定义
对象被定义为无序属性的集合,其属性值可以包含基本值,对象或者函数
属性值
属性名不强制要求遵守标识符的规范,但是建议遵守
如果要使用特殊的属性名,不能使用点操作符来操作对象的属性,只能使用方括号
中括号中的属性名还可以是一个变量
分类
创建对象
对象字面量
语法如下:
let obj ={
a:1,
b:2
}
工厂模式
使用字面量方式可以很方便地创建一个对象,但是创建多个变量的时候就比较麻烦了,因此可以使用工厂模式,批量创建一些对象。
工厂模式是用来批量创建对象,提供一个模子,然后通过这个模子复制出我们的对象,需要多少个,就复制多少个
步骤
语法
var createPerson = funtion(name,age){
// 声明一个中间对象
var o = new Object()
// 依次添加属性和方法
o.name = name
o.age = age
// 返回这个对象
return o
}
// 创建对象
var p1 = createPerson('Tom','18')
var p2 = createPerson('Tom1','18')
// 使用工厂模式创建 实际上就是通过 函数创建对象
工厂模式对象的缺点
无法识别实例的对象的类型,因为创建的对象都是通过 new Object()创建的,所以无法区分,都是Object()的对象。
构造函数
语法
// 声明一个构造函数
function Person(name,age){
this.name = name
this.age = age
}
// 使用构造函数创建对象
let p1 = new Person()
访问对象的属性和方法
操作对象的属性
可以使用 点操作符,中括号的方式 获取对象的属性值
删除对象的属性 delete 对象名.属性名(并没有真正删除这个,只是解除引用)
函数
声明函数
function关键字声明
使用function关键字声明的函数 会发生函数提升。比var变量声明有更为优先的执行顺序。
语法
function fn() {
console.log('hello')
}
变量声明
语法
var fn = function(){
console.log("hello")
}
与函数声明不同,函数表达式 使用了var 进行声明,那么声明的过程中就必须按照var声明变量的规则来进行判断。var变量声明实际上进行了两步,先声明,再赋值。
// 变量声明
var a = 20;
// 实际执行顺序
var a = undefined; // 变量声明,初始值undefined,变量提升,提升顺序次于function声明
a = 20; // 变量赋值,该操作不会提升
由于这种原因,不可在声明之前执行该函数,否则会报错。
fn(); // 报错
var fn = function() {
console.log('function');
}
匿名函数
函数自执行
语法
(function() {
// ...
})();
在ES5中,没有块级作用域,因此常常用函数自执行的方式来模仿块级作用域,这样就提供了一个独立的执行上下文,结合闭包,就为模块化提供了基础。
函数参数传递方式: 按值传递
基本数据类型 复制,是直接值发生了复制,因此改变后,各自相互不影响。
但是引用类型的复制,是保存在变量对象中的引用发生了复制,因此复制之后的这两个引用实际访问的是同一个内存中的值。 当改变其中一个时,另一个自然也被改变。
当值作为函数的参数传递进函数内部时,也有同样的差异。
函数的参数在进入函数后,实际是被保存在函数的变量对象中,因此相当于发生了一次复制。
当函数作为参数传递时,真正传递的是,只是这个引用类型保存在变量对象中的引用。