面向过程
思维方式:把解决问题的关注点,放到解决问题的每一个详细步骤上面。
面向对象
思维方式:把解决问题的关注点,放到解决问题需要的一些对象身上。
创建对象:
- 对象字面量
- 使用内置构造对象
- 封装简单的工厂函数
- 自定义构造函数
构造函数
- 定义:构造函数也是函数,通常用来初始化对象,并且和new关键字同时出现。
- 书写:构造函数名,首字母要大写,以示区分。
- 实例化:通过构造函数创建对象的过程,就叫做实例化。
- 实例:通过构造函数实例化出来的对象就是该构造函数的一个实例。
构造函数执行过程:
- 使用new关键字创建对象;
- 调用构造函数,把新创建出来的对象赋值给构造函数内的this;
- 在构造函数内使用this为新创建出来的对象新增成员(属性和方法);
- 默认返回新创建的这个对象(普通的函数,如果不写return语句,会返回undefined)。
构造函数的返回值:
- 如果不写返回值,默认返回的是新创建出来的对象(一般都不会写return语句);
- 如果自己写return语句,return的是空值(return;),或者是基本类型的值或者null,都默认返回新创建出来的对象;
- 如果返回的是object类型的值,将不会返回刚才新创建的对象,取而代之的是return后面的值。
构造函数注意事项:
- 如果像正常的函数一样使用构造函数,构造函数中的this将不再指向新创建出来的对象(因为根本就没有创建对象);
- 构造函数中的this这时指向的是window全局对象,当时用this给对象添加成员的时候,全部都添加到了window上。
原型
- 在构造函数创建出来的时候,系统会默认地帮构造函数创建并关联一个神秘的对象,这个对象就是原型。原型默认的是一个空的对象。
- 作用:原型中的属性和方法,可以被使用该构造函数创建出来的对象使用。
- 如何访问构造函数的原型:构造函数.prototype;
- 注意:prototype是构造函数的属性,跟对象没有关系;
- 如何给原型对象添加属性和方法:使用对象的动态特性;
- 使用对象访问属性和方法:会首先在自己内部进行查找,如果找到了,就直接使用;如果没有找到,就去原型中查找,查找到之后使用;如果原型中还没有,如果是属性,返回undefined,如果是方法,就报错。
- 使用原型解决构造函数存在的问题:构造函数原型对象中的成员,可以被该构造函数创建出来的所有对象访问,并且所有的对象共享该对象;所以可以将构造函数中需要创建的函数,放到原型对象中存储,这样就解决了传统构造函数中全局变量污染的问题以及代码结构混乱的问题。
- 当你修改构造函数的原型的时候,你已经创建出来的对象的原型是不会随之改变的。
对象
js中的对象:键值对的组合就是对象。
面向对象是对面向过程的封装,有了面向对象,并不意味着可以抛弃面向过程。
属性值存的是一个地址。
编写代码时的原则:DRY(Don't repeat yourself)
封装
1. 使用函数封装:代码的复用性提高。
函数封装带来的问题:全局变量污染;代码结构不清晰,维护不方便。
2. 使用对象封装的优势:暴露在全局的只有一个对象名,不会造成全局变量污染;使用对象将代码进行功能模块的划分,有利于日后的维护。