博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2021.5.18 JS高级第一天
阅读量:2147 次
发布时间:2019-04-30

本文共 2198 字,大约阅读时间需要 7 分钟。

1.什么是对象

1.对象是单个事物的抽象

一本书、一辆汽车、一个人都可以是对象,一个数据库、一张网页、一个与远程服务器的连接也可以是对象。当实物被抽象成对象,实物之间的关系就变成了对象之间的关系,从而就可以模拟现实情况,针对对象进行编程。

2.对象是一个容器,封装了属性(property)和方法(method)

属性是对象的状态,方法是对象的行为(完成某种任务)。比如,我们可以把动物抽象为animal对象,使用“属性”记录具体是那一种动物,使用“方法”表示动物的某种行为(奔跑、捕猎、休息等等)。在实际开发中,对象是一个抽象的概念, 可以将其简单理解为:数据集或功能集.

提示:每个对象都是基于一个引用类型创建的,这些类型可以是系统内置的原生类型,也可以是开发人员自定义的类型。
Everything is object (万物皆对象)

2.什么是面向对象

面向对象不是新的东西,它只是过程式代码的一种高度封装,目的在于提高代码的开发效率和可维护性。

面向对象编程 —— Object Oriented Programming,简称 OOP ,是一种编程开发思想。 它将真实世界各种复杂的关系,抽象为一个个对象,然后由对象之间的分工与合作,完成对真实世界的模拟。
在面向对象程序开发思想中,每一个对象都是功能中心,具有明确分工,可以完成接受信息、处理数据、发出信息等任务。
因此,面向对象编程具有灵活、代码可复用、高度模块化等特点,容易维护和开发,比起由一系列函数或指令组成的传统的过程式编程(procedural programming),更适合多人合作的大型软件项目。

3.面向对象与面向过程

面向过程:

面向过程就是亲力亲为,事无巨细,面面俱到,步步紧跟,有条不紊
面向对象就是找一个对象,指挥得结果
面向对象将执行者转变成指挥者
面向对象不是面向过程的替代,而是面向过程的封装

4.面向过程的体现

在 JavaScript 中,所有数据类型都可以视为对象,当然也可以自定义对象。

定义的对象数据类型就是面向对象中的类( Class )的概念。

我们以一个例子来说明面向过程和面向对象在程序流程上的不同之处。

5.面向对象的基本体现 (一)

如果采用面向对象的程序设计思想,我们首选思考的不是程序的执行流程, 而是 Student这种数据类型应该被视为一个对象,这个对象拥有 namescore这两个属性(Property)。

如果要打印一个学生的成绩,首先必须创建出这个学生对应的对象,然后,给调用 printScore,将成绩打印。
抽象数据行为模板(Class)

抽象数据行为模板(Class):

function Student(name,score){
this.name=name;
this.score=score;
this.printScore=function(){
alert(‘姓名:’+this.name+’ '+‘成绩:’+this.score);
};

6.面向对象的基本体现(二)

面向对象的设计思想是从自然界中来的,因为在自然界中,类(Class)和实例(Instance)的概念是很自然的。

Class 是一种抽象概念,比如我们定义的 Class——Student ,是指学生这个概念,而实例(Instance)则是一个个具体的 Student ,比如, Michael 和 Bob 是两个具体的 Student 。

所以,面向对象的设计思想是:

1.创建描述事物的类 【面向对象的封装】
2.根据类创建出具体的对象
3.调用自己的属性和方法
面向对象的抽象程度又比函数要高,因为一个 Class 既包含数据,又包含操作数据的方法。

创建对象

简单方式–通过 new Object() 创建

解析构造函数代码的执行

Person()函数取代了createPerson()`函数,但是实现效果是一样的。

Person()中的代码与 createPerson()有以下几点不同之处:

1.没有显示的创建对象
2.直接将属性和方法赋给了 this对象
3.没有 return语句
4.函数名使用的是大写的 Person

而要创建 Person实例,则必须使用 new操作符。以这种方式调用构造函数会经历以下 4 个步骤:

  1. 创建一个新对象
  2. 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象)
  3. 执行构造函数中的代码
  4. 返回新对象

构造函数和实例对象的关系

使用构造函数的好处不仅仅在于代码的简洁性,更重要的是我们可以识别对象的具体类型了。在每一个实例对象中的__proto__中同时有一个 constructor属性,该属性指向创建该实例的构造函数

总结:

1.构造函数是根据具体的事物抽象出来的抽象模板
2.实例对象是根据构造函数new出来的
3.每一个实例对象都具有一个 constructor 属性,指向创建该实例的构造函数

原型

prototype .

Javascript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。
这也就意味着,我们可以把所有对象实例需要共享的属性和方法直接定义在 prototype 对象上。

构造函数、实例、原型三者之间的关系

在这里插入图片描述

			

转载地址:http://qbzwb.baihongyu.com/

你可能感兴趣的文章
剑指offer 60. 不用加减乘除做加法
查看>>
Leetcode C++《热题 Hot 100-13》234.回文链表
查看>>
Leetcode C++《热题 Hot 100-14》283.移动零
查看>>
Leetcode C++《热题 Hot 100-15》437.路径总和III
查看>>
Leetcode C++《热题 Hot 100-17》461.汉明距离
查看>>
Leetcode C++《热题 Hot 100-18》538.把二叉搜索树转换为累加树
查看>>
Leetcode C++《热题 Hot 100-19》543.二叉树的直径
查看>>
Leetcode C++《热题 Hot 100-21》581.最短无序连续子数组
查看>>
Leetcode C++《热题 Hot 100-22》2.两数相加
查看>>
Leetcode C++《热题 Hot 100-23》3.无重复字符的最长子串
查看>>
Leetcode C++《热题 Hot 100-24》5.最长回文子串
查看>>
Leetcode C++《热题 Hot 100-26》15.三数之和
查看>>
Leetcode C++《热题 Hot 100-28》19.删除链表的倒数第N个节点
查看>>
Leetcode C++《热题 Hot 100-29》22.括号生成
查看>>
Leetcode C++《热题 Hot 100-44》102.二叉树的层次遍历
查看>>
Leetcode C++《热题 Hot 100-47》236.二叉树的最近公共祖先
查看>>
Leetcode C++《热题 Hot 100-48》406.根据身高重建队列
查看>>
《kubernetes权威指南·第四版》第二章:kubernetes安装配置指南
查看>>
Leetcode C++《热题 Hot 100-49》399.除法求值
查看>>
Leetcode C++《热题 Hot 100-51》152. 乘积最大子序列
查看>>