面向对象(OOP:Object Oriented Programming)
概要
- 理解面相对象思想
- 会使用工厂模式
- 会使用new运算符
- 会使用构造函数
- 理解原型
- 理解原型链
- 会使用继承
- 理解类和对象
- 包装对象
面向对象编程思想
一、面相过程:注重解决问题的步骤,分析问题需要的每一步,实现函数依次调用;
二、面相对象:是一种程序设计思想。将数据和处理数据的程序封装到对象中;
三、面相对象特性: 抽象、 继承、封装、多态
优点:提高代码的复用性及可维护性;
Javascript 是一种基于对象的语言,几乎所有东西都是对象;
对象创建方法:
-
字面量创建
-
new Object()创建
-
Object.create()创建:创建对象的原型;
工厂模式
一、工厂模式---提高代码复用性;
方法(){原料,加工,出厂}
new运算符
- new的特点:1.new执行函数 2.自动创建空对象; 3.this绑定到空对象;4 隐式返还this;5.
- 通过new来改造工厂模式
构造函数
- 构造函数首字母大写
- this指向实例化对象
- 静态属性及方法属于类
- 静态方法里的this;
工厂模式对比构造函数/特点
- A.prototype原型:公共空间存放公共方法(节约内存 ##构造函数提升性能
- 对象识别:a.consturctor=>A 由A构造a
prototype原型
- 对象其属性和方法来自两个部分-构造函数+原型(追加)
- 原型本身是一个对象,是一个公共空间,存放公共方法(节约内存。
原型构造函数及对象关系
-
对象其属性和方法来自两个部分-构造函数+原型(追加)。构造函数 通过new实例化 对象;a.proto== A.prototype
-
构造函数A.prototype=>原型;原型的固有属性constructor指向构造函数 A.prototype.constructor == A; a.consructor == A
-
应用:判断实例化对象的类型"a".constructor===String
原型链
- 对象之间的继承关系,通过prototype原型对象指向父类对象,直到指向null为止,这样就形成了一个原型指向的链条,称之为原型链;
- 查找对象的属性或方法时,就近:先在对象自身上查找,如果不存在就去原型链中查找 ,直到找到为止。如果还找不到返回 undefined。
继承
- 继承:子类继承父类所有属性和行为,父类不受影响。
- 目的:找到类之间的共性精简代码
- 方式:
-
构造函数继承-内部-call,apply([数组形式的参数]),bind(返回一个函数,不会立即执行。())
-
原型链继承-外部-B.prototype==new A()
深拷贝继承-- 传值和传址问题
基本数据类型:Number、String、Boolean、Null、Undefined传值
复杂数据类型/引用数据类型:Array、Date、Math、RegExp、Object、Function等传址,互相影响--》解决深拷贝 - 深拷贝方式:
1.JSON序列化
json.parse(json.stringfy(obj)) 不足:丢失拷贝对象的函数、undefined等值
2.封装深拷贝函数
function deepCopy(obj){ let newObj = Array.isArray(obj)?[]:{}; for(let key in obj){ if(obj.hasOwnProperty(key)){ if(typeof obj[key] == "object"){ newObj[key] = deepCopy(obj[key]); }else{ newObj[key] = obj[key]; return newObj;
3. 组合继承-
function Dad(){ this.name = "张三"; } Dad.prototype.hobby = function(){ console.log("喜欢篮球"); } function Son(){ Dad.call(this); } let F = function(){} F.prototype = Dad.prototype; Son.prototype = new F(); Son.prototype.constructor = Son; let newSon = new Son(); newSon.hobby();
- 传值和传址问题
包装对象
- 除过null,undefined,基本类型都有自己对应的包装对象:String Number Boolean
- 包装对象把所有的属性和方法给了基本类型,然后包装对象消失