知识点概要
- 对象的创建
- 工厂模式
- new运算符
- 构造函数
- 原型prototype
- 原型链
- 构造函数继承
- 原型的继承
- 包装对象
- 面向对象和面向过程编程
- 类和对象概念
序:面向对象编程思想
1、面向过程:注重解决问题的步骤,分析问题需要的每一步,实现函数的依次调用
2、面向对象:是一种程序设计思想,将数据和处理数据的程序封装到对象中
3、面向对象特性:抽象、继承、封装、多态
优点:提高代码复用性及可维护性
一、对象的创建
//对象创建
//1. 字面量
const obj = {
name:"zhangsan",
age:20
}
//2. 构造函数
const obj = new Object();
obj.name = "zhangsan";
//3. Object.create 属性和方法会被创建到原型上
const obj = Object.create({
name:"zhangsan",
age:20
})
二、工厂模式
//提高代码的复用性,减少代码冗余
function Person(name,age){
let obj = {}
obj.name = name;
obj.age = age;
return obj
}
const zhangsan = Person("张三",20)
const lisi = Person("李四",20)
三、new运算符
- 执行函数
- 创建对象
- 绑定this
- 隐式返还this
四、构造函数
//使用new运算符将工厂模式函数改造为一个构造函数
//1. 首字母大写
//2. this指向实例化对象
function Person(name,age){
this.name = name;
this.age = age;
}
const zhangsan = new Person("张三",20)
五、原型prototype
- ES5中构造函数由两部分构成:
- 1.自身的属性及方法
- 2.原型prototype
- 原型prototype中存在一个固有属性constructor属性指向构造函数本身
- 构造函数通过new实例化之后自身的属性及方法会指向实例化出来的对象,而原型中的属性和方法会指向实例化对象中
__proto__ __proto__与prototype在内存中是同一个地址,只是表现形式不同
六、原型链
- 当访问一个对象的属性或方法时,会先在对象自身上查找属性或者方法是否存在,如果存在就使用对象自身的属性和方法,如果不存在就去创建对象的构造函数的原型对象中查找,依此类推,直到找到为止,如果到顶层对象中还找不到,则返回undefined。
- 原型链最顶层为Object构造函数的原型对象,给Object.prototype添加属性或方法可以被除null和undefined之外的所有数据类型对象使用。
七、构造函数继承
- call、apply、bind
function foo(){
console.log(this)
//非严格模式下默认指向window
}
let obj = {
name:"张三"
}
foo.call(obj,args,args...)//改变this指向
foo.apply(obj,[...args])
foo.bind(obj)(args,args...)
- 应用到构造函数继承
function Dad(){
this.moeny = 1000000000
}
function Son(){
Dad.call(this)
}
八、原型的继承
function Dad(){
this.moeny = 1000000000
}
Dad.prototype.fn = function(){
console.log("fn")
}
function Son(){
Dad.call(this)
}
Son.prototype = deepCopy(Dad.prototype)
//使用深拷贝解决复杂数据类型的传址问题来实现原型的继承
const Link = function(){}
Link.prototype = Dad.prototype;
Son.prototype = new Link();//会覆盖掉Son原型中constructor
Son.prototype.constructor = Son//重新指回constructor指向
//使用组合继承实现原型的继承