面向对象
- 格式:docx
- 大小:28.03 KB
- 文档页数:19
面向对象的7条基本原则包括
1. 单一职责原则 (Single Responsibility Principle, SRP):一个类只负责单一的功能或任务。
2. 开放封闭原则 (Open-Closed Principle, OCP):软件实体应该对扩展开放,对修改关闭。
3. 里氏替换原则 (Liskov Substitution Principle, LSP):子类应该能够替换其父类,而不影响程序的正确性。
4. 接口隔离原则 (Interface Segregation Principle, ISP):不要强迫客户端依赖它们不需要使用的接口,将接口分割成更小更具体的部分。
5. 依赖倒置原则 (Dependency Inversion Principle, DIP):高层模块不应该依赖于低层模块,而应该依赖于抽象接口。
6. 迪米特法则 (Law of Demeter, LoD):一个对象应该对其他对象尽可能少的了解,只与最直接的朋友通信。
7. 合成复用原则 (Composition/Aggregation Reuse Principle, CARP):优先使用组合/聚合而不是继承来实现代码重用。
什么是⾯向对象、对象是什么、什么是类、如何使⽤对象、类和对象的关系⾯向对象⼀、⾯向对象 概念:⾯向对象是⼀种编程思想,使⽤编程语⾔解决现实问题的⼀种思路。
分类: ⾯向过程: C 语⾔ ⾯向对象: Java ⾯向对象的思想: ⾯向对象的思想: ⾯向过程的思想:⾃顶向下 逐步执⾏。
---> 当解决⼀件事情的时候,⾸先想到的是我该怎么去做⾯向对象思想:以对象为中⼼,使⽤对象调⽤其功能。
---> 当解决⼀件事情的时候,⾸先想到的是我该让谁帮我做。
想到的谁 ---> 对象 对象:现实⽣活中存在的真实的事物都是对象,Java 中有⼀句名⾔: 万物皆对象,⼤到宇宙、⼩到夸克在Java 的世界中都可以看成对象。
提起对象,就需要提起另⼀个概念——类。
类是对象的模板,对象是类的实例。
⼆、类 概念: 将具有相同特征的⼀类事物的共性进⾏抽取(抽取的过程叫做抽象),形成的⼀个概念叫做类。
类的抽象: 1. 怎么去描述⼀个事物,从哪些维度进⾏描述? 这个事物具有什么 ---> 属性 这个事物会做什么 ---> ⾏为 2. 怎么去描述⼀类事物的共性? 这些事物具有什么 ---> 属性 这些事物会做什么 ---> ⾏为 类和对象的关系: 类是对象的模板 对象是类的实例 类的定义: 概述: 属性 : 使⽤成员变量来进⾏描述 ⾏为 : 使⽤成员⽅法进⾏描述 语法:关键词:class语法:public class 类名{} 成员变量 定义位置:类中⽅法外 语法: 数据类型 变量名; / 数据类型 变量名 = 初始值;作⽤域:⾄少在本类 默认值: 和数组元素的默认值是⼀样的 基本数据类型 整数类型 0 ⼩数类型 0.0 字符类型空字符 布尔类型 false 引⽤数据类型 null 定义的注意事项 1. 在同⼀个类中不能定义两个同名的成员变量 2. 在同⼀个类中成员变量可以和局部变量可以重名,但是在访问的时候,局部变量优先。
面向对象面试题1、什么是面向对象面向对象OO = 面向对象的分析OOA + 面向对象的设计OOD + 面向对象的编程OOP;通俗的解释就是万物皆对象,把所有的事物都看作一个个可以独立的对象(单元),它们可以自己完成自己的功能,而不是像C那样分成一个个函数;现在纯正的OO语言主要是java和C#,C++也支持OO,C是面向过程的。
2、简述private、protected、public、internal 修饰符的访问权限。
private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 当前程序集内可以访问。
3、中的五个主要对象Connection:主要是开启程序和数据库之间的连结。
没有利用连结对象将数据库打开,是无法从数据库中取得数据的。
这个物件在 的最底层,我们可以自己产生这个对象,或是由其它的对象自动产生。
Command:主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及呼叫存在数据库中的预存程序等。
这个对象是架构在Connection 对象上,也就是Command 对象是透过连结到数据源。
DataAdapter:主要是在数据源以及DataSet 之间执行数据传输的工作,它可以透过Comm and 对象下达命令后,并将取得的数据放入DataSet 对象中。
这个对象是架构在Command 对象上,并提供了许多配合DataSet 使用的功能。
DataSet:这个对象可以视为一个暂存区(Cache),可以把从数据库中所查询到的数据保留起来,甚至可以将整个数据库显示出来。
DataSet 的能力不只是可以储存多个Table 而已,还可以透过DataAdapter对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。
DataSet 对象可以说是 中重量级的对象,这个对象架构在DataAdapter对象上,本身不具备和数据源沟通的能力;也就是说我们是将DataAdapter对象当做DataSet 对象以及数据源间传输数据的桥梁。
1.面向对象的概念面向对象(Object-Oriented)=对象(Object)+类(Class)+ 继承(Inheritance)+通信(Communication)如果一个软件系统是使用这样4个概念设计和实现的,则将该软件系统称为面向对象的。
下面给出每个概念的具体定义。
1.1 对象从一般意义上讲,对象是现实世界中一个实际存在事物,它可以是有形的(比如一辆汽车),也可以是无形(比如一项计划)。
对象构成世界的一个独立单位,它具有自己的静态特征和动态特征。
静态特征即可用某种数据来描述的特征,动态特征即对象所表现的行为或对象所具有的功能。
现实世界中的任何事物都可以称作对象,它是大量的、无处不在的。
不过,人们在开发一个系统时,通常只是在一定的范围(问题域)内考虑和认识与系统目标有关的事物,并用系统中的对象抽象地表示它们。
所以面向对象方法在提到“对象”这个术语时,既可能泛指现实世界中的某些事物,也可能专指它们在系统中的抽象表示,即系统中的对象。
我们主要对后一种情况讨论对象的概念,其定义是:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。
一个对象由一组属性和对这组属性进行操作的一组服务构成。
属性和服务,是构成对象的两个主要因素,其定义是:属性是用来描述对象静态特征的一个数据项。
服务是用来描述对象动态特征(行为)的一个操作序列。
一个对象可以有多项属性和多项服务。
一个对象的属性和服务被结合成一个整体,对象的属性值只能由这个对象的服务存取。
在有些文献中把对象标识(OID)列为对象的另一要素。
对象标识也就是对象的名字,有“外部标识”和“内部标识”之分。
前者供对象的定义者或使用者用,后者为系统内部惟一的识别对象。
(怎么感觉这点跟android开发里面的id是一样的,在某个文件下有编程人员定义的所有属性的id,并且是唯一的,一般不允许更改,属于系统内部分配。
) 另外需要说明以下两点:第一点是,对象只描述客观事物本质的与系统目标有关的特征,而不考虑那些非本质的与系统目标无关的特征。
⾯向对象与⾯向过程的优缺点⾯向过程 优点:性能⽐⾯向对象⾼,因为类调⽤时需要实例化,开销⽐较⼤,⽐较消耗资源;⽐如单⽚机、嵌⼊式开发、Linux/Unix等⼀般采⽤⾯向过程开发,性能是最重要的因素。
缺点:没有⾯向对象易维护、易复⽤、易扩展 ⾯向对象 优点:易维护、易复⽤、易扩展,由于⾯向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 缺点:性能⽐⾯向过程低 ⾯向对象程序设计的⼀些显著的特性包括: .程序设计的重点在于数据⽽不是过程; .程序被划分为所谓的对象; .数据结构为表现对象的特性⽽设计; .函数作为对某个对象数据的操作,与数据结构紧密的结合在⼀起; .数据被隐藏起来,不能为外部函数访问; .对象之间可以通过函数沟通; .新的数据和函数可以在需要的时候轻⽽易举的添加进来; .在程序设计过程中遵循由下⾄上(bottom-up)的设计⽅法。
⾯向对象程序设计在程序设计模式中是⼀个新的概念,对于不同的⼈可能意味着不同的内容。
我们对⾯向对象程序设计的定义是"⾯向对象程序设计是⼀种⽅法,这种⽅法为数据和函数提供共同的独⽴内存空间,这些数据和函数可以作为模板以便在需要时创建类似模块的拷贝。
这样的程序设计⽅法称为⾯向对象程序设计。
" 从以上定义可以看到,⼀个对象被认为是计算机内存中的⼀个独⽴区间,在这个区间中保存着数据和能够访问数据的⼀组操作。
因为内存区间是相互独⽴的,所以对象可以不经修改就应⽤于多个不同的程序中。
什么是⾯向对象程序设计? ⾯向对象程序设计(OOP)技术汲取了结构化程序设计中好的思想,并将这些思想与⼀些新的、强⼤的理念相结合,从⽽给你的程序设计⼯作提供了⼀种全新的⽅法。
通常,在⾯向对象的程序设计风格中,你会将⼀个问题分解为⼀些相互关联的⼦集,每个⼦集内部都包含了相关的数据和函数。
同时,你会以某种⽅式将这些⼦集分为不同等级,⽽⼀个对象就是已定义的某个类型的变量。
面向对象个人心得体会篇一:面向对象的编程总结一、什么是面向对象:所谓面向对象的编程就是:通过封装,继承,多态,把程序的耦合度降低,传统的雕版印刷术的问题就在于所有刻字都在同一版面上造成耦合度太高所致,当用面向对象的模式,使得印刷程序更加灵活,容易修改,并且易于复用。
对象(Object)是类(Class)的一个实例(Instance)。
如果将对象比作房子,那么类就是房子的设计图纸。
所以面向对象程序设计的重点是类的设计,而不是对象的设计。
类可以将数据和函数封装在一起,其中函数表示了类的行为(或称服务)。
类提供关键字public、protected 和private 用于声明哪些数据和函数是公有的、受保护的或者是私有的。
二:基类类与结构体的区别和联系; Strcut test{Private:Int number; Public:Float socre; };类的创建方式和结构体几乎一样, Class test {Private:Int number; Public:Float socre;Public:Public:Int rp();{ Return number;}Void setnum(int a) {Number=a; }}; 但是大家注意到没有,标准c中不允许在结构体中声明函数的,但是在c++中的类中是可以的,这就和c有了本质的区别,很好体现了c++面向对象的特点。
两种语言的区别:过去的c语言是一种面向过程的语言特性是:程序=算法+数据结构但c++的特性是:对象=算法+数据结构;程序=对象+对象+对象。
区别:在c语言中个成员他们的默认存储控制是public 而c++类中默认的存储控制是private.; 上面的rp()事成员函数,如果我们有如下定义: Test a;的话,调用rp()就可以写成: a. rp();成员函数的调用和普通成员的调用方式一致都采用“.”的操作符。
例如: class test {private://私有成员类外不能够直接访问 int number;public://共有成员类外可以直接访问 float socre; public: int rp() {return number; } void setnum(int a) {number=a; } };void main() { test a; //a.number=10;//错误的,私有成员不能外部访问 a.socre=99.9f; cout<<a.socre<<endl;a.setnum(100);//通过共有成员函数setnum()间接对私有成员number函数进行访问 cout<<a.rp(); cout<<endl; }/*int pp=0; class test {private: int number; public: float socre; int pp; public: void rp(); };void test::rp() { ::pp=11; pp=100; }void main() { test a; test b; a.rp(); cout<<pp<<endl; cout<<a.pp<<endl; }*/利用域区分符我们可以在类定义的外部设置成员函数,但要注意的是,在类的内部必须预声明:类型类名 :: 函数名()=值void test::rp()在函数类型的后面加上类的名称再加上域区分符(::)再加函数名称,利用这样的方法我们就在类的外部建立了一个名为rp 的test类大成员函数(方法),可能很多人要问,这么做有意义吗?在类的内部写函数代码不是更好?答案是这样的:在类的定义中,一般成员函数的规模一般都比较小,而且一些特殊的语句是不能够使用的,而且一般会被自动的设置成为inline(内联)函数,即使你没有明确的声明为inline,那么为什么有会被自动设置成为inline呢?因为大多数情况下,类的定义一般是放在头文件中的,在编译的时候这些函数的定义也随之进入头文件,这样就会导致被多次编译,如果是inline的情况,函数定义在调用处扩展,就避免了重复编译的问题,而且把大量的成员函数都放在类中使用起来也十分不方便,为了避免这种情况的发生,所以c++是允许在外部定义类的成员函数(方法)的,将类定义和其它成员函数定义分开,是面向对象编程的通常做法,我们把类的定义在这里也就是头文件了看作是类的外部接口,类的成员函数的定义看成是类的内部实现。
⾯向对象的优缺点使⽤⾯向对象思想进⾏开发有以下优点:1、易维护采⽤⾯向对象思想设计的结构,可读性⾼,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是⾮常⽅便和较低成本的。
2、质量⾼在设计时,可重⽤现有的,在以前的项⽬的领域中已被测试过的类使系统满⾜业务需求并具有较⾼的质量。
3、效率⾼在软件开发时,根据设计的需要对现实世界的事物进⾏抽象,产⽣类。
使⽤这样的⽅法解决问题,接近于⽇常⽣活和⾃然的思考⽅式,势必提⾼软件开发的效率和质量。
4、易扩展由于继承、封装、多态的特性,⾃然设计出⾼内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,⽽且成本较低。
⼋、OO⽅法特点和优缺点1.特点(1)利⽤特定软件直接从对象客体的描述到软件结构的转换。
(2)解决了传统结构化⽅法中客观世界描述⼯具与软件结构的不⼀致性。
(3)减少了从系统分析、设计到软件模块结构之间的多次转换映射的繁杂过程。
2.OO⽅法优缺点优点:(1)是⼀种全新的系统分析设计⽅法(对象、类、结构属性、⽅法)。
(2)适⽤于各类信息系统的开发。
(3)实现了对客观世界描述到软件结构的直接转换,⼤⼤减少后续软件开发量。
(4)开发⼯作的重⽤性、继承性⾼,降低重复⼯作量。
(5)缩短了开发周期。
缺点:(1)需要⼀定的软件⽀持环境。
(2)不太适宜⼤型的MIS开发,若缺乏整体系统设计划分,易造成系统结构不合理、各部分关系失调等问题。
(3)只能在现有业务基础上进⾏分类整理,不能从科学管理⾓度进⾏理顺和优化。
(4)初学者不易接受、难学。
⾯向对象⽅法学把分析、设计和实现很⾃然地联系在⼀起了。
虽然⾯向对象设计原则上不依赖于特定的实现环境,但是实现结果和实现成本却在很⼤程度上取决于实现环境。
因此,直接⽀持⾯向对象设计范式的⾯向对象程序语⾔、开发环境及类库,对于⾯向对象实现来说是⾮常重要的。
为了把⾯向对象设计结果顺利地转变成⾯向对象程序,⾸先应该选择⼀种适当的程序设计语⾔。
⾯向对象和⾯向过程的区别⼀、⾯向对象与⾯向过程的区别⾯向过程就是分析出解决问题所需要的步骤,然后⽤函数把这些步骤⼀步⼀步实现,使⽤的时候⼀个⼀个以此调⽤就可以了;⾯向对象是把构成问题事务分解成各个对象,建⽴对象的⽬的不是为了完成⼀个步骤,⽽是为了描述某个事物在整个解决问题的步骤中的⾏为。
可以拿⽣活中的实例来理解⾯向过程与⾯向对象,例如五⼦棋,⾯向过程的设计思路就是⾸先分析问题的步骤:1、开始游戏;2、⼩⿊先⾛;3、绘制画⾯;4、判断输赢;5、轮到⼩⽩;6、绘制画⾯;7、判断输赢;8、返回步骤2;9、输出最后的结果。
把上⾯每个步骤⽤不同的⽅法来实现。
如果是⾯向对象的设计思想来解决问题。
⾯向对象的设计则是从另⼀个思路来解决问题。
整个五⼦棋可以分为1、⿊⽩双⽅,这两⽅的⾏为是⼀模⼀样的。
2、棋盘系统,负责绘制画⾯。
3、规则系统,负责判定诸如犯规、输赢等。
第⼀类对象(玩家对象)负责接收⽤户输⼊,并告知第⼆类对象(棋盘对象)棋⼦布局的变化,棋盘对象接收到了棋⼦的变化就要负责在屏幕上显⽰出这种变化来,同时利⽤第三类对象(规则系统)来对棋局进⾏判定。
可以明显的看出来,⾯向对象是以功能来划分问题,⽽不是步骤。
同样是绘制棋局,这样的⾏为在⾯向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,因为通常设计⼈员会考虑到实际情况进⾏各种各样的简化。
⽽⾯向对象的设计中,绘图只可能在棋盘对象中出现,从⽽保证了绘图的统⼀性。
总结来说就是两句话:⾯向对象就是⾼度事物抽象化,⾯向过程就是⾃项向下的编程。
⼆、⾯向对象的主要特征三、⾯向过程与⾯向对象的优缺点⽤⾯向过程的⽅法写出来的程序是⼀份蛋炒饭,⽽⽤⾯向对象写出来的程序是⼀份盖浇饭。
所谓盖浇饭,北京叫盖饭,东北叫烩饭,⼴东叫碟头饭,就是在⼀碗⽩⽶饭上⾯浇上⼀份盖菜,你喜欢什么菜,你就浇上什么菜。
我觉得这个⽐喻还是⽐较贴切的。
蛋炒饭制作的细节,我不太清楚,因为我没当过厨师,也不会做饭,但最后的⼀道⼯序肯定是把⽶饭和鸡蛋混在⼀起炒匀。
面向对象的三种方法
面向对象编程是一种常见的编程范式,主要思想是将问题分解成一系列对象,通过对象之间的交互来解决问题。
在面向对象编程中,有三种主要的方法,分别是继承、封装和多态。
1. 继承
继承是一种将已有类的属性和方法传递给新类的方式。
在继承中,我们可以定义一个基类(也称为父类或超类),然后创建一个或多个派生类(也称为子类)。
子类可以继承父类的属性和方法,也可以添加自己的属性和方法。
继承可以减少代码的重复,提高代码的复用性,并且可以简化类的层次结构。
2. 封装
封装是指将类的内部数据和方法隐藏在类的外部,只暴露一些公共接口给外部使用。
通过封装,我们可以隐藏一些细节,使得代码更加安全和易于维护。
封装还可以提高代码的可复用性,因为我们可以将类的实现细节隐藏并重新使用。
3. 多态
多态是指在不同的情况下,同一种对象可以表现出不同的形态。
多态可以通过继承和接口的方式实现。
在继承中,一个子类可以重写父类的方法,从而改变其行为。
在接口中,多个类可以实现同一个接口,但是具体实现方式可以不同。
多态可以提高代码的灵活性和可扩展性。
总之,继承、封装和多态是面向对象编程中的三种重要方法。
通过使用它们,我们可以提高代码的复用性、可维护性和可扩展性,从而更好地解决编程中的问题。
面向对象编程的四个主要概念
1.对象——实体
一个学生可以是一个对象,那么这个学生的属性有学号,年级,班级等;行为有选课,考试,体侧等。
2.类——抽象
类是将所有对象的公有属性和行为抽象出来的。
学校学生类,这个类的属性有有学号,年级,班级等;行为有选课,考试,体侧等。
(这是从每一个对象公有的行为与属性中抽象出来的)
3.方法
类的行为的实现过程叫做类的方法。
其实也就是类中成员函数的定义。
即一个方法包含方法名(函数名),返回值类型,参数表,方法体(函数体)
4.消息
对象之间需要相互沟通,沟通的途径就是向对象发送消息。
其实也就是对象调用类的成员函数的语句。
即一条消息包含接收消息的对象名,对象需执行的行为名称(方法名),调用方法所需的参数。
正课:1. 错误处理2. *****Function1. 错误处理:错误: 程序在执行过程中遇到的异常中断当发生错误时,程序会报错,退出。
错误处理: 即使发生错误,也保证程序不中断退出的机制。
如何:try{可能发生错误的正常逻辑}catch(err){只有发生错误时才执行的错误处理代码://包括: 1. 记录日志://2. 提示用户//3. 保存数据}finally{//无论是否出错,都一定会执行的代码//包括: 释放内存}其中err:一旦try中的程序发生错误,js会自动创建一个Error类型的对象。
Error:专门封装错误信息的对象。
6种:SyntaxError: 语法错误ReferenceError: 引用错误,要使用的变量,或对象,没找到。
TypeError: 类型错误,指错误的使用了类型的方法。
RangeError: 参数超范围URIError,EvalError如果可以提前预知错误的原因,就可用if...else...代替try catch判断浏览器兼容性:try{new XMLHttpRequest();提示: 支持Ajax}catch(){提示: 不支持Ajax}也可用if...else代替鄙视题: try catch中的return如果finally中有return,则使用finally中的return返回如果finally中没有return,try中的return,会先获得要返回的值,但挂起,暂不返回。
要等待finally中代码执行完,才返回。
主动抛出错误:何时: 当API的开发者,向API的调用者提示错误时。
如何抛出: throw new Error("信息")2.*****Functionjs中的一切函数都是一个对象创建函数: 3种:1. 声明方式:function 函数名(参数列表){函数体;return 返回值;}——被声明提前(hoist)其中:function是创建一个新函数的意思函数其实是一个对象函数对象中封装的不是数据,而是代码段。
函数名仅是引用函数对象的普通变量2. 函数直接量:var函数名=function(参数列表){不会被声明提前。
何时: 如果不希望函数定义被提前时,就必须用直接量。
3. 用new:var函数名=new Function("参数名1",...,"函数体")何时: 如果函数的参数名和函数体可能在运行时动态生成。
***重载(overload): 相同函数名,不同参数列表的多个函数,在调用时,可根据传入的参数不同,自动选择对应的函数执行。
为什么: 为了减少函数的个数,减轻使用者的负担。
如何: js中默认不支持重载的语法变通: arguments对象函数中自动创建的,接收所有传入函数的参数值得类数组对象。
类数组对象: 长的像数组的对象vs数组: 相同: 1. 用下标访问元素2. length属性不同: 不是数组类型,无法使用数组类型的API。
3.错误处理:try{可能出错的正常代码}catch(err){只有出错才执行的错误处理代码}finally{无论是否出错总会执行的代码}Error:SyntaxError,ReferenceError,TypeErrorRangeError, URIError, EvalError主动抛出异常:throw new Error("错误信息");4.Function:创建:1. 声明:function 函数名(参数列表){函数体return 返回值;}——被声明提前(hoist)2. 直接量:var函数名=function(参数列表){——不会被声明提前3. 用new:var函数名=new Function("参数名",...,"函数体")js中,函数其实就是一个对象。
封装了一段可反复执行的代码段。
函数名其实只是一个引用函数对象的变量重载:(overload)何时: 如果一件事,根据不同的参数,执行不同的逻辑时如何:arguments: 函数中自动创建的自动接收所有传入函数的参数值得类数组对象arguments[i] //获得第i个参数值arguments.length //获得参数个数正课:1.*****Function匿名函数****作用域和作用域链*****闭包1.匿名函数:什么是: 在创建时,不被任何变量引用的函数。
为什么: 节约内存何时: 只要一个函数只用一次,就释放如何使用:1.回调: 创建一个函数后,将函数对象传递给其他函数调用。
比如:arr.sort(function(a,b){return a-b});arr.replace(reg,function(){return xxx;})2.自调: 创建一个函数,然后立刻调用执行执行后,立刻释放(function(参数列表){函数体;return 返回值;})(参数值);何时: 如果一项任务仅执行一次,且使用了仅属于当前任务的变量时,就要将变量和任务代码封装在一个匿名函数中,自调****作用域和作用域链:作用域(scope): 一个变量的可用范围本质: 存储变量的对象函数的原理:程序开始执行:创建ECS(Execution Context Stack):顺序保存正在调用的函数的执行环境向ECS中压入第一个EC:EC:函数调用时,引用所有变量的元素。
创建全局作用域对象window:EC引用window函数定义时: 创建函数对象在全局创建函数名变量引用函数对象在函数对象中添加一个scope属性:引用函数来自的作用域对象函数调用时:向ECS中压入要调用函数的执行环境EC创建函数作用域对象(活动对象AO):AO:保存本次函数调用时,使用的所有局部变量的对象。
在AO中添加parent属性,引用函数对象的scope属性指向的作用域。
EC中的scope chain属性引用AO对象函数调用后: 本次调用的函数的EC出栈导致:AO释放导致: 局部变量一同释放作用域链(scope chain):由各级作用域对象,逐级引用形成的链式结构控制变量的使用顺序:优先使用AO中的局部变量如果局部没有,才延作用域链向下找,到window如果window也没有才报错*****闭包(closure):重用局部变量,并保护变量不受污染的机制为什么:全局变量: 随处可用,可反复使用缺: 极易被污染局部变量: 不会被污染缺:仅函数内可用,且不可重用何时: 只要希望重用一个局部变量,又不希望局部变量被污染时如何: 3步:Step1: 将受保护的变量和操作变量的函数封装在一个外层函数中定义。
Step2: 外层函数,要将内层函数队形返回Step3: 使用者调用外层函数,获得内层函数对象。
正课:1. *****Function闭包2. *****OOP1. *****Function:闭包:如何: 3步:1. 用外层函数封装受保护的变量和操作变量的内层函数2. 外层函数返回内层函数的对象3. 使用者调用外层函数,获得内层函数的对象。
三大特点:1. 外层函数2. 受保护的变量3. 内层函数BS:1. 先找受保护的变量:1. 外层函数的局部变量2. 内层函数中被使用判断当外层函数结束时,受保护的变量最终的值。
2. 找外层函数返回的内层函数对象:1. return function2. 直接给全局变量赋值一个function3. 将多个内层函数放入数组或对象中,批量返回。
结论:同一次外层函数调用返回的多个内层函数对象共用同一个受保护的变量。
先后两次外层函数调用返回的两个内层函数对象,分别使用各自的受保护的变量副本,互不影响。
优: 重用变量,且保护其不被篡改缺: 占用更多的内存空间。
无法自动释放2.*****面向对象:什么是: 程序中都是用对象来描述现实中一个具体事物。
什么是对象: 程序中封装现实中一个具体事物的属性和功能的程序结果事物的属性,会成为对象的属性事物的功能,会成为对象的方法为什么: 更符合人的想法。
如何使用: 2步:1. 先用对象描述一个事物的属性和功能-创建对象/封装封装: 将事物的属性和功能集中定义在一个对象中。
3种:1.对象直接量:varobj={属性名:值,方法名:function(){//对象的方法中,要使用对象自己的属性,必须写成"this.属性名"//当前对象的...}}this: 指正在调用方法的.前的对象***js中一切对象底层都是hash数组2.用new:varobj=new Object();obj.属性名=值;obj.方法名=function(){...this.属性名...}其中new可省,()也可省,但不能同时省略。
3.反复创建多个相同结构的对象:2步:1.定义构造函数:什么是: 专门描述一类对象统一结构的函数。
何时: 只要反复创建多个相同结构的对象时。
为什么: 代码重用——优如何:function 类型名(属性参数){this.属性名=属性参数;this.方法名=function(){...}}2.用new调用构造函数:varobj=new 类型名(属性值);new: 4件事儿:1. 创建了一个空对象:2. ?3. 用空对象调用构造函数4. 返回新对象地址给变量缺: 没有解决内存浪费的问题2. 再按照逻辑的需要,依次调用对象中的功能来操作对象的属性。
访问对象的成员(属性和方法):操作对象的属性: obj.属性名其实就是一个放在对象中的普通变量而已。
特殊:访问对象中没有的属性,不报错,返回undefined.为对象中不存在的属性赋值,不报错,会自动添加属性,保存属性值。
调用对象的方法: obj.方法名();其实就是一个放在对象中的普通函数而已。
回顾:1.OOP:创建:1. 直接量:varobj={属性名:值,方法名:function(){this.属性名}}2. 用new:varobj=new Object();obj.属性名=值;obj.方法名=funciton(){this.属性名;}3. 用构造函数,反复创建多个相同结构的对象2步:1. 定义构造函数:function 类型名(属性参数列表){this.属性名=属性参数;this.方法名=function(){this.属性名...}}优: 代码重用缺: 没有解决内存浪费的问题2. 用new调用构造函数:——实例化(instance)一个xxx类型的对象。
varobj=new 类型名(属性值列表)其中:obj也成为xx类型的一个实例访问对象成员:obj.属性名=>obj["属性名"]obj.方法名();本质: js中一切对象底层都是hash数组,属性名是字符串类型的key,属性值是value。