一.对象在js中被称为引用类型的值,而且有一些内置的引用类型可以用来创建特定的对象,总结如下:
1.引用类型与传统面向对象程序设计中的类相似,但实现不同。
2.Object是一个基础类型,其他所有类型都从Object继承了基本的行为。
3.Array类型是一组值的有序列表,同时还提供了操作和转换这些值的功能。
4.Date类型提供了日期和时间的信息,包括当前日期和时间,以及相关的计算功能。
5.RegExp类型是ES中支持正则表达式的一个接口,提供了一些最基本的和一些高级的正则表达式功能。
二.函数实际上是Function类型的实例,所以函数也是对象,也有属性和方法,可以用来增强其行为。
三.因为有了基本包装类型,所以js中的基本类型值可以被当做对象来访问,3种基本包装类型:Boolean,Number,String,共同特征如下:
1.每个包装类型都会映射到同名的基本类型。
2.在读取模式访问基本类型值时,就会创建对应的基本包装类型的一个对象,从而方便了读取数据操作。
3.操作基本类型值的语句一经执行完毕,就会立即销毁新创建的基本包装类型的对象。
四.在所有代码执行之前,作用域中就存在两个内置对象:Global和Math对象。在大多数es实现中都不能直接访问Global对象。在web浏览器中实现了承担该对象角色的window对象。全局变量和函数都是Global对象的属性。Math对象提供了很多属性和方法,辅助完成复杂的数学计算任务。
五.ES支持面向对象编程,但不使用类或接口。对象可以在代码执行过程中创建和增强,因此具有动态性而非严格定义的实体。在没有类的情况下,可采用下列模式创建对象:
1.工厂模式:
使用简单的函数创建对象,为对象添加属性和方法,然后返回对象。后来被构造函数模式所取代!
2.构造函数模式:
可以创建自定义引用类型,可以像创建内置对象实例一样使用new操作符。
缺:它的每个成员都无法得到复用,包括函数。由于函数可以不局限于任何对象,所以没有理由不在多个对象间共享函数。
3.原型模式:
使用构造函数的prototype属性来指定那些应该共享的属性和方法。
组合使用构造函数模式和原型模式时,使用构造函数定义实例属性,使用原型定义共享的属性和方法。
六.js主要通过原型链实现继承,原型链的构建是通过将一个类型的实例赋值给另一个构造函数的原型实现的。
这样,子类就能够访问超类型的所有属性和方法,这一点与基于类的继承很相似。问题:对象实例共享所有继承的属性和方法,因此不适宜单独使用。
**借用构造函数模式可以解决原型链继承的问题。即:在子类构造函数的内部调用超类型构造函数,这样就能做到每个实例都具有自己的属性,同时还能保证只使用构造函数模式来定义类型。
**组合继承(最多):使用原型链继承共享的属性和方法,通过借用构造函数继承实例属性。2
此外还存在其他继承模式:
1.原型式继承:
可以在不 预先定义构造函数的情况下实现继承,本质是执行给定对象的浅复制,复制到的副本还可以得到进一步改造。
2.寄生式继承:
与原型式继承非常相似,也是基于某个对象或某些信息创建一个对象,然后增强对象,最后返回对象。
3.寄生组合式继承:(为了解决组合继承模式由于多次调用超类型构造函数而导致的低效率问题)
集寄生式继承和组合式继承的优点于一身,是实现基于类型继承的最有效方式。
七.在js中,表达式是一种非常有用的技术。使用表达式可以无需对函数命名,从而实现动态编程。匿名函数也成为拉姆达函数,是一种使用js函数的强大方式。
1.函数表达式不同于函数声明,函数声明要求有名字,但函数表达式不需要。没有名字的函数表达式也叫匿名函数。
2.在无法确定如何引用函数的情况下,递归函数就会变得比较复杂。
3.递归函数应该始终使用argumnets.callee来递归的调用自身,不要使用函数名,因为函数名可能会随时发生变化。
八.当在函数内部定义其他函数时,就创建了闭包。闭包有权访问函数内部的所有变量,原理如下:
1.在后台执行环境中,闭包的作用域包含着它自己的作用域,包含函数的作用域和全局作用域。
2.通常,函数的作用域及其所有变量在函数执行完毕都会被销毁。
3.但是,当函数返回了一个闭包时,这个函数的作用域将会一直保存在内存中直到闭包不存在为止。
九.使用闭包可以在js中模仿块级作用域,要点如下:
1.创建并立即调用一个函数,这样既可以执行其中的代码,又不会再内存中留下对该函数的引用。
2.结果就是函数内部的所有变量都会被立即销毁,除非将某些变量赋值给了包含函数中的变量。
十.闭包还可以用于在对象中创建私有变量,要点如下:
1.即使js中没有正式的私有对象属性的概念,但可以使用闭包来实现共有方法,而通过公有方法可以访问在包含作用域中定义的变量。
2.有权访问私有变量的公有方法叫做特权方法。
3.可以使用构造函数模式,原型模式 来实现自定义类型的特权方法,也可以使用模块模式,增强的模块模式来实现单例的特权方法。
注:创建闭包必须维护额外的作用域,过度使用它们可能会占用大量内存。