![82cbce38d94ba2c3f906930740c5cbfe.png](https://i-blog.csdnimg.cn/blog_migrate/a674aca05c60493060e4c9c705c8bbad.jpeg)
1传统创建对象;
var
如果再创建一个拥有name,age属性和say方法的人;难道要把上面的代码复制一次么?那要是创建成千上万的人哪?这样就显得代码冗余,浪费性能,那我们就来封装个函数实现这个功能;也就是工厂模式;
2工厂模式创建对象;
function
从上面的代码可以看出工厂模式创建对象有3个步骤
- 写一个函数
- 在函数内部创建一个对象(相当于这个工厂流水线需要的原料,)
- 给这个对象添加属性和方法;(相当于工厂中加工的这个步骤)
- 返回这个对象;(相当于工厂中出厂的这个步骤!)
特点:用封装函数来创建对象的细节,内部最终返回一个对象。
优点:解决了创建多个相似对象的问题。
缺点:不能确定对象的类型。(即无法用instanceof去判断)
3我们来比较一下工厂模式创建对象和官方创建对象的区别;
以数组为例:
console
从上面例子可以看出;工厂模式创建对象和官方窜关键对象的区别有2
- 官方创建对象用了new 构造函数
- 它们所有的方法是你同一套方法;
4 构造函数创建对象;
构造函数概念:通过new运算符调用的函数叫构造函数。构造函数可以构造对象!
如果一个函数使用了new操作符会执行一下四个步骤
- 创建一个对象
- 连接到所有对象的原型
- 绑定this指向,执行构造函数。当前构造函数中的this指向新的对象。
- 确保返回值是对象
function
构造函数创建对象解决了没有new的问题!但是没有解决不共享一套函数的问题
特点:
- 没有显示的创建对象
- 属性和方法赋给了this
- 没有return语句
调用过程
- 使用new操作符创建一个对象。
- 将构造函数的作用域赋给新对象(this就指向了新对象)
- 执行构造函数里的代码
- 返回新对象
优点:
可将实列标识成一种特定的类。(可以用instanceof判断)
缺点:每个方法都要在每个实例上创建一遍。可以将其写在外部共享,但是又不失去了封装性。
function
5 接下来我们来看原型对象他会解决不共享一套函数的问题
1概念:每一个函数都有一个原型对象prototype.
用在构造函数上可以给构造函数的原型prototype添加方法;
如果我们将方法添加到构造函数的原型prototype上。构造函数构造出来的对象共享原型上所有的方法;
还有以数组为例:
var
可以看到它们共享了同一个求和方法;
补充几点
- 原型,构造函数,与实列的关系:每一个构造函数都有一个原型对象(prototype属性),原型对象包含一个指向构造函数的指针(constructor),实列包含一个指向原型对象的(__proto__).实列与构造函数没有直接关系。
- 访问一个对象的过程:现在它本身有没有 如果本身没有就找原型对象上。如果在本身上找到了就不在往下找下去。
- 判断属性是否在实例中:hasOwnProperty(),true——实列
优点:属性和方法可以共享。并且可以在实列上从新定义,而不会改变原型;
缺点:由于共享,对于引用类型,在实列上进行修改,也会改变原型的值:
function
6构造函数+原型模式 也混合法创建对象。
//用es6语法传入的是个对象
构造函数构造出来的对象都有一个__proto__属性,指向构造函数的原型对象。
instanceof:关键字:功能:判断出这个对象是不是由构造函数构造出来的!
特点:所有共享的属性和方法在原型中定义;自己独有的构造函数定义
混合法创建对象的优点:既可以共享又有特定的类型
7 面向对象编程。
面向对象编程是一种思想,和面向对象编程相对的是面向过过程编程。面向过程编程只时注重于数学逻辑。
面向对象编程:将生活中的逻辑映射到我们程序中的思想叫面向对象编程
特点:封装,继承,多态
面向对象编程是一种编程思想:支持面向对象编程思想的语法是类。
构造函数和对象实现面向对象程序的时候提出:封装继承多态的特点
7 接下来我们来看继承 更加细分的构造函数。
继承:用于创建作为一个或多个类专用版本的类。(JavaScript仅支持单类继承)。这个专用类通常被称为子类(child),而其他类通常被称为父类(parent)。在JavaScript中,你要完成继承,需将父类的实例赋给子类,然后将子类特化(specializing)。
function
上面代码借用call方法实现继承接下来我们看为什么说 Teddy.prototype=Dog.prototype
是一个非常错误的写法。就看下下面对象的拷贝
8.对象的拷贝
最简单的方法for..in循环
var
因为:obj 和obj1 这两个指针指向的是同一个地址:
当obj1变化的时候obj也会改变!如果让它们的原型直接相等的花:
在向子集构造函数加方法时父级构造函数也会得到这个方法;不符合继承的定义。
我们来看简单的对象拷贝
var
9 我们来看一下多态
多态:同种事情有两种完全不同的侧重,侧重自己子集从写和新增方法。
继承:侧重父级函数继承的属性和方法
function
10 es6 class 类,继承
构造函数创建类
关于面向对向类 继承 的知识点很多 今天就到这里了