面向对象编程
对象是什么?为什么要面向对象?面向对象的优势? =>简化了我们对于流程部分的岔路准备
面向对象的思想中有两个重要概念:类、对象。
类:具有相同特征和行为的事物的抽象
对象:类的实例
特点:逻辑迁移更加灵活、代码复用性更高、高度模块化
经典例子:
main.js —>new Vue() // 实例化
-
面向对象是以对象功能来划分问题,而不是步骤。
面向对象是把事务分解成为一个个对象,然后由对象之间分工与合作。 -
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的一次调用就可以了。
面向对象的特性
封装性:把一个具有相同的特征和行为的客观事物封装成抽象的类。类可以把自己的数据及方法让可信的类或则对象操作,类中的数据和方法可以私有化,让对象中的数据和方法提供了不同程度的保护,但是值得注意的是,在ES6中的类,没有提供类的私有化属性,参考上文,因此严格意义上说,ES中的面向对象思想与传统的基于类的面向对象有一定的差异。
继承性:让某一个类型的对象获得另一个类型对象的属性和方法。继承能够使用现有类的所有功能,并能无需重新编写原有类的情况下,对现在功能进行扩展。继承可分为实现继承(直接使用父类的属性及方法)和接口继承(使用属性和方法的名称,在子类中提供实现的能力)。不过在js中继承被简单化为:获取存在对象属性和方法的一种方式
。在js中有很多种方式来实现继承下文中我们慢慢来实现关于js的继承。
多态性:一个类实例中的相同方法和属性在不同场景有不同的表现形式。多态能够使具有不同内部结构的对象共享相同的外部接口。在java中的面向对象中的多态是建立在继承和重载的基础之上的,它能够创建具有多种形式的变量,函数或对象。它主要用途在于不同类型的对象响应相同名称的方法,字段或属性调用的能力,每个对象根据适当的类型特定行为进行响应。但是前端中ES语言本身就具有一种多态的特性,具体下文介绍。
面向对象的继承实现: https://zhuanlan.zhihu.com/p/184901347
面向对象编程
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
缺点:性能比面向过程低
面向过程编程
优点:性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用的面向过程编程
缺点:没有面向对象易维护、易复用、易扩展
封装是面向对象思想中比较重要的一部分,js面向对象可以通过构造函数实现的封装
1.构造函数体现了面向对象的封装特性
2.构造函数实例创建的对象彼此独立、互不影响
简单对象
对象属性的增删改查
属性的增加
关于对象属性key调用及增加:
调用方法: obj.key obj[“key”]
var obj = {};
obj.1a = 1; //报错
obj['1a'] = 1 // {1a :1}
obj[1a] = 11 // 报错
obj[2] = 2 // {1a :1, 2 :2}
//查看
obj.1a //报错
obj.2 //2
obj['1a'] // 1
查看读取 obj.key obj[“key”]
document.write 与 console.log 差别:
修改
*删除
应用:
对象的创建方法
3.var obj = Object.create(原型)——创建一个具有指定原型和属性的新对象,此方法提供了对对象继承的更多控制。
4.ES6中class类语法
5.构造函数构造实例对象方法
函数对象
// 构造实例的函数对象 => 构造函数
//=> ES - class
构造函数
理解:
构造函数就是一个普通的函数,创建方式和普通函数没有区别,不同的是构造函数习惯上首字母大写。另外就是调用方式的不同,普通函数是直接调用,而构造函数需要使用new关键字来调用。
命名:
构造函数自定义写法
car和car1彼此独立:
构造函数的内部原理/new:
new之后:
1、创建一个新的对象(在函数体最前面隐式加上 var obj = Object.create(Student.prototype);)
2、将构造函数的this指向这个新对象obj,并执行代码 this.xxx = xxx;
3、隐式返回这个新对象 this;
构造函数里的this以及原型里的this对象最终指向的都是生成的实例,原因就是由new决定的
PS:没有new就是正常函数执行:
模拟一个构造函数:(不这么用)
构造函数返回的就是对象,有new就不可能返回原始值
包装类
(原始值不能有属性和方法;只有对象有)
可使用new String(‘abcd’) / Object(‘abcd’)
处理后类型: object类型
原始值没有属性和方法。原始值操作属性
:
隐式处理
如下:
字符串对象有系统自带的length属性,(不可更改值)
可使用valueOf() 方法将包装类转倒换成基本类型:
补:Symbol()函数不能与new关键字一起作为构造函数使用,可借用Object()函数
如果想使用符号包装对象,可以借用Object()函数
:
练习:
注释:预编译 add会覆盖