javascript是弱类型,直译式的面相对象编程语言。
在之前我们说过
var a = 123; 在这里a是整数 但是我们可以给a重新复制为 a="你好"; 在这个过程中变量a 的值发生了改变,对应的类型也不再是数值类型,我们称这种特性为弱类型。
直译式指的是不需要通过其他方式,浏览器可以直接编译解析的方式为直译式。
那么面相对象是什么呢oo?
简单来说 面相对象要拆分为两个不同的单词进行描述 面相-对象 面相是个很好理解的单词,就是对着,面对 我们可以说面向世界,面向未来 ,这里面主要的就是对象这个词语。
面向对象:对现实世界的理解与抽象,是计算机编程技术发展到一定阶段的产物。
ok 上诉描述有点抽象,我们来举个栗子
大家都知道计算机最终的目的是通过电脑来解决现实中的事物与功能。那我们现在要用计算机来描述一个航班信息。
大家思考下,我们首先需要个飞机,然后需要一些旅客。
那在这里面我们当然不能在电脑里装一个飞机或者一堆人(二次元可以试试)。那怎么办呢?
在这里我们通过一些描述信息 如 string字符串 或number数值来描述一个真实飞机。
那在这里,我们就通过使用js的内置数据类型来描述了一个飞机的特性,那么小伙伴会有个问题~ 这里哪有对象 哪有面相? ok我们继续向下来处理。
上面的代码我们只是描述了一个简单的飞机,如果我们有两架飞机怎么办呢?
我们可以通过定义额外的变量来进行描述,当然这种方式很不理想,因为我无法确定我定义的是一个飞机还是以个拖拉机或者三*。这个时候就需要我们面相对象来进行登场了
----------------------------------------- 我是前戏分割线 --------------------------------------------
面向对象:通过将现实世界中具有相同属性和行为的事物抽取为一个类,一个类的实例,我们称之为对象的实例。
类:具有相同属性和行为的事物的抽象体。
对象: 一个类的具体实现和显示的真实例子。
首先我们搞清楚类的概念,什么是类?
类的概念有点抽象和空虚,比如我们可以说 小明 和 小红 是 人,那么在这个过程中, 人就是类,小明和小红就是类的实体,也就是我们常说的对象。
类具有两个特殊的实现方式,我们称之为属性和方法。
属性 :一般用来描述我们看得见摸得着的抽象。如色彩、身高、体重、名字等
方法(行为) :方法一般指动态的操作行为。比如跑步、说话、上学、写作业、泡妹纸...
类的特点:类一般是抽象而成,也就是说本身不具有实际的行动意义,需要一个实际的例子来用来对他的内部进行操作。
对象:通过关键字new或其他方式创建,继承了类的属性和行为的真实例子进行操作。
我们的编程就是定义好一个类,然后通过对实例对象的操作进行工作,这种方式就是面向对象。
大家可以想象下我们在之前接触的对象概念 如 String、Number 他们都是类的概念定义,而一个new String('123')、new Number(123)就是这个类的实体,我们一直以来也只是对着实体操作,因为面向对象概念非常复杂,我们后期慢慢进行。
//ok 我们来进行第一件事情,创建一个类
//首先我们创建一个人的类
//来思考下 人有什么用的共性呢?
属性: 头 手 脚 眼睛 衣服...
行为: 吃饭 唱歌 跑步 运动
在javascript中,并没有对类的创建提供单独的方式,所以我们只能使用function函数来进行创建。
首先了解第一种方式:
工厂模式:
通过function定制一个创建对象的模板,在运行结束后返回一个定制好的对象,具有一定的属性和行为。
但是在这里面我们有一个问题,那就是无法告知别人当前对象是哪一种类。
构造模式:
构造模式通过使用函数+new关键字分别创建类和实例
在这里我们注意点,一般使用构造模式进行创建时,函数名称首字母一般大写(行业规范),
那么在使用new关键字时,这里面发生了几个变化
1.new+函数后会创建返回一个当前函数类型的对象
2.函数内部的this指向更改为指向当前的 new 函数,也就是新创建的对象本身
3.生成constructor 用于声明指向当前对象的构造函数
4.新创建的对象生成一个__proto__的属性 指向构造函数的prototype
原型构造模式:
如果将属性和行为都放在函数内部中进行创建,不利于位于,尤其是在业务比较复杂的情况下,所以又提供了原型模式。
动态原型模式
有些时候我们想要一个类继承另一个类的属性,那么这种时候我们就可以使用动态原型模式
在上述代码中通过创建Person类,boy类,Girl类。
在Boy和girl中 ,通过使用person替换this创建私有属性和方法(但是不会继承原型对象,原型对象只有在new关键字才会继承)。
组合模式
通过将原型模式和构造模式一起使用
面向对象先简单介绍基础知识到这里