判断类型是否继承_创建 对象的方式:面向对象;封装继承,多态class类;

82cbce38d94ba2c3f906930740c5cbfe.png

1传统创建对象;

var 

如果再创建一个拥有name,age属性和say方法的人;难道要把上面的代码复制一次么?那要是创建成千上万的人哪?这样就显得代码冗余,浪费性能,那我们就来封装个函数实现这个功能;也就是工厂模式;

2工厂模式创建对象;

function 

从上面的代码可以看出工厂模式创建对象有3个步骤

  1. 写一个函数
  2. 在函数内部创建一个对象(相当于这个工厂流水线需要的原料,)
  3. 给这个对象添加属性和方法;(相当于工厂中加工的这个步骤)
  4. 返回这个对象;(相当于工厂中出厂的这个步骤!)

特点:用封装函数来创建对象的细节,内部最终返回一个对象。

优点:解决了创建多个相似对象的问题。

缺点:不能确定对象的类型。(即无法用instanceof去判断)

3我们来比较一下工厂模式创建对象和官方创建对象的区别;

以数组为例:

console

从上面例子可以看出;工厂模式创建对象和官方窜关键对象的区别有2

  1. 官方创建对象用了new 构造函数
  2. 它们所有的方法是你同一套方法;

4 构造函数创建对象;

构造函数概念:通过new运算符调用的函数叫构造函数。构造函数可以构造对象!

如果一个函数使用了new操作符会执行一下四个步骤

  1. 创建一个对象
  2. 连接到所有对象的原型
  3. 绑定this指向,执行构造函数。当前构造函数中的this指向新的对象。
  4. 确保返回值是对象
function 

构造函数创建对象解决了没有new的问题!但是没有解决不共享一套函数的问题

特点

  1. 没有显示的创建对象
  2. 属性和方法赋给了this
  3. 没有return语句

调用过程

  1. 使用new操作符创建一个对象。
  2. 将构造函数的作用域赋给新对象(this就指向了新对象)
  3. 执行构造函数里的代码
  4. 返回新对象

优点:

可将实列标识成一种特定的类。(可以用instanceof判断)

缺点:每个方法都要在每个实例上创建一遍。可以将其写在外部共享,但是又不失去了封装性。

function 

5 接下来我们来看原型对象他会解决不共享一套函数的问题

1概念:每一个函数都有一个原型对象prototype.

用在构造函数上可以给构造函数的原型prototype添加方法;

如果我们将方法添加到构造函数的原型prototype上。构造函数构造出来的对象共享原型上所有的方法;

还有以数组为例:

var 

可以看到它们共享了同一个求和方法;

补充几点

  1. 原型,构造函数,与实列的关系:每一个构造函数都有一个原型对象(prototype属性),原型对象包含一个指向构造函数的指针(constructor),实列包含一个指向原型对象的(__proto__).实列与构造函数没有直接关系。
  2. 访问一个对象的过程:现在它本身有没有 如果本身没有就找原型对象上。如果在本身上找到了就不在往下找下去。
  3. 判断属性是否在实例中: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 类,继承

构造函数创建类

关于面向对向类 继承 的知识点很多 今天就到这里了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值