JavaScript重要概念之函数,对象

1,340 阅读4分钟

对象

概念

定义

对象被定义为无序属性的集合,其属性值可以包含基本值,对象或者函数

属性值

属性名不强制要求遵守标识符的规范,但是建议遵守
如果要使用特殊的属性名,不能使用点操作符来操作对象的属性,只能使用方括号
中括号中的属性名还可以是一个变量

分类

  1. 内建对象
  2. 宿主对象 由ES的执行环境提供,目前来说主要是浏览器提供给的对象
  3. 自定义对象 开发人员自己定义的对象

创建对象

创建对象的方式有,字面量,工厂模式,构造函数等方法

对象字面量

语法如下:

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中,没有块级作用域,因此常常用函数自执行的方式来模仿块级作用域,这样就提供了一个独立的执行上下文,结合闭包,就为模块化提供了基础。

函数参数传递方式: 按值传递

基本数据类型 复制,是直接值发生了复制,因此改变后,各自相互不影响。
但是引用类型的复制,是保存在变量对象中的引用发生了复制,因此复制之后的这两个引用实际访问的是同一个内存中的值。 当改变其中一个时,另一个自然也被改变。
当值作为函数的参数传递进函数内部时,也有同样的差异。
函数的参数在进入函数后,实际是被保存在函数的变量对象中,因此相当于发生了一次复制。
当函数作为参数传递时,真正传递的是,只是这个引用类型保存在变量对象中的引用。