4.1对象
4.1.1 回顾JavaScript数据类型
- number(数值类型)。
- string(字符串类型)。
- boolean(布尔类型)。
- null(空类型)。
- undefined(未定义类型)。
- object:一种复杂的数据类型,该类型实例化的对象是一组数据和功能的集合。
4.1.2 对象是什么
1.对象是包含相关属性和方法的集合体。
2.对象是总有属性和方法的数据。属性是与对象相关的值,方法是能够在对象上执行的动作。
3.面向对象仅仅是一个概念或者编程思想而已,是通过一种叫作原型的方式来实现面向对象编程的。
4.1.3 创建对象
对象分为两种:
- 自定义对象。
- 内置对象。
1.自定义对象
与Java创建对象一样,创建自定义对象的最简单的方式就是使用操作符new创建的一个object的实例,然后通过"."为其添加属性和方法。
语法:
var 对象名称=new Object();
一种是基于Object对象的方式创建对象。
一种是使用字面量赋值的方式创建对象。
2.内置对象
内置对象是一种特殊的数据,
String(字符串)对象。
Date(日期)对象。
Array(数组)对象。
Boolean(逻辑)对象。
Math(算数)对象。
RegExp对象。
RegExp是正则表达式的缩写。
4.2 构造函数和原型对象
4.2.1 构造函数
构造函数始终都应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头。
必须使用new操作符。
四步骤:
- 创建一个新对象。
- 将构造函数的作用域赋给新对象,(this就指向了这个新对象)。
- 执行构造函数中的代码。
- 返回新对象。
对象的constructor属性最初是用来标识对象类型的,但是提到检测对象类型,还是instanceof操作符更可靠一点。
创建自定义的构造函数意味着将来可以将它的实例标识为一种特定的类型,而这正是构造函数的优点。
4.2.2 原型对象
1.创建的每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
2.prototype就是通过调用构造函数而创建的那个对象实例的原型对象,使用原型对象的好处就是可以让所有对象实例共享它所有的属性和方法。
3.所有的原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向prototype属性所在函数的指针。
各个对象之间的关系
4.3 继承
两种继承方法:接口继承和实现继承。
4.3.1 原型链
每个构造函数都拥有一个原型对象,原型对象都包含一个指向构造函数的指针(constructor),实例都包含一个指向原型对象的内部指针(proto_)。
构造函数和原型之间的关系
所有函数都默认原型都是Object的实例,因此默认原型都会包含一个内部指针,指向(Object.prototype)。
4.3.2 对象继承
最重要的是来自包含引用类型值的原型,由于包含引用类型值的原型属性会被所有实例共享,在通过原型来实现继承时,原型实际上会变成另一个类型的实例,因此,原先的实例属性也就变成了现在的原型属性了。
1.借用构造函数
在子类型构造函数的内部调用父类型构造函数即在子类型构造函数的内部通过apply()或call()方法调用父类型的构造函数,也可以在将来新创建的对象上执行构造函数。
语法:
apply([thisObj[,argArray]])
应用某一对象的一个方法,用另一个对象替换当前对象。
call([thisObj[,arg1[,arg2[,[.argN]]]]])
调用一个对象的一个方法,以另一个对象替换当前对象。
用途相同,在特定的作用域中调用函数,apply()接收两个参数,一个是函数运用的作用域(this),另一个是参数数组。call()方法第一个参数与apply()方法相同。
借用构造函数还有一个很大的优势,即可以在子类型构造函数中向父类型构造函数传递参数。
2.数组继承
数组继承(combination inheritance)有时也叫作伪经典继承,指的是将原型链和借用构造函数的技术组合到一块,从而发挥二者之长的一种继承模式。使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现属性的继承。