Everything is object (万物皆对象)。
对象究竟是什么,咱们能够从两个层次来理解。javascript
1.对象是单个事物的抽象java
一本书、一辆汽车、一我的均可以是对象,一个数据库、一张网页、一个与远程服务器的链接也能够是对象。当实物被抽象成对象,实物之间的关系就变成了对象之间的关系,从而就能够模拟现实状况,针对对象进行编程。
程序员
2.对象是一个容器,封装了属性(property)和方法(method)数据库
属性是对象的状态,方法是对象的行为(完成某种任务)。好比,咱们能够把动物抽象为animal对象,使用“属性”记录具体是那一种动物,使用“方法”表示动物的某种行为(奔跑、捕猎、休息等等)
编程
在实际开发中,对象是一个抽象的概念,能够将其简单理解为 : 数据集或功能集。
面向对象编程是用抽象方式建立基于现实世界模型的一种编程模式。它使用先前创建的范例,包括模块化,多态和封装几种技术。今天,许多流行的编程语言(如Java,JavaScript,C#,C+ +,Python,PHP,Ruby和Objective-C)都支持面向对象编程(OOP)。服务器
相对于「一个程序只是一些函数的集合,或简单的计算机指令列表。」的传统软件设计观念而言,面向对象编程能够看做是使用一系列对象相互协做的软件设计。 在 OOP 中,每一个对象可以接收消息,处理数据和发送消息给其余对象。每一个对象均可以被看做是一个拥有清晰角色或责任的独立小机器。数据结构
面向对象程序设计的目的是在编程中促进更好的灵活性和可维护性,在大型软件工程中广为流行。凭借其对模块化的重视,面向对象的代码开发更简单,更容易理解,相比非模块化编程方法 1, 它能更直接地分析, 编码和理解复杂的状况和过程。编程语言
面向对象编程 —— Object Oriented Programming,简称 OOP ,是一种编程开发思想。
它将真实世界各类复杂的关系,抽象为一个个对象,而后由对象之间的分工与合做,完成对真实世界的模拟。
在面向对象程序开发思想中,每个对象都是功能中心,具备明确分工,能够完成接受信息、处理数据、发出信息等任务。
所以,面向对象编程具备灵活、代码可复用、高度模块化等特色,容易维护和开发,比起由一系列函数或指令组成的传统的过程式编程(procedural programming),更适合多人合做的大型软件项目。模块化
1.3 面向对象的特色函数
-封装
对于一些功能相同或者类似的代码,咱们能够放到一个函数中去,屡次用到此功能时,咱们只须要调用便可,无需屡次重写。
创造对象的几种模式:单例模式,工厂模式,构造函数模式,原型模式等。
继承
子类能够继承父类的属性和方法
var obj = { name: "Tom ", sex: " man", age:19, run:function(){ console.log("一天跑一千米"); } }
var obj = new Object(); obj.name = "Tom "; obj.sex = " man"; obj.age = 19; obj.run = function(){ console.log("一天跑一千米"); }
具备相同特性(数据元素)和行为(功能)的对象的抽象就是类。所以,对象的抽象是类,类的具体化就是对象,也能够说类的实例是对象,类实际上就是一种数据类型。类具备属性,它是对象状态的抽象,用数据结构来描述类的属性。类具备操做,它是对象行为的抽象,用操做名和实现该操做的方法来描述。
做为初学者,容易混淆类和对象的概念。类(Class)是一个抽象的概念,对象则是类的具体实例。好比:人是一个类,司马迁,李白,杜甫都是对象;首都是一个类,则北京,伦敦,华盛顿,莫斯科都是对象;动物猫是一个类,则Kitty、Grafield 和 Doraemon 都是对象。
咱们能够说 Kitty 猫的体重是 1.5kg,而不能说猫类的体重是 1.5kg;能够说李白是诗人,而不能说人类是诗人。状态是描述具体对象而非描述类的,行为是由具体对象发出的而非类发出的。
类与对象的关系就如模具和铸件的关系,类实例化的结果就是对象,而对象的抽象就是类,类描述了一组有相同特性(属性)和相同行为的对象
class person{ }//这个是类 $obj = new person();//类的实例化就是对象
// Class 模板 function Person(name,sex,age){ var obj = {}; obj.name = name; obj.sex = sex; obj.age = age; obj.run = function(){ console.log("天天坚持跑步"); } return obj; } // 实例化 var person1 = Person("Tom","sex",19); //操做 person1.run(); // 输出结果:天天坚持跑步
优势:
一、 在工厂模式中,用户只须要知道所要生产的具体东西,无须关心具体的建立过程,甚至不须要具体产品类的类名。
二、 在系统增长新的产品时,咱们只须要添加一个具体产品类和对应的实现工厂,无需对原工厂进行任何修改,很好地符合了“开闭原则”。
缺点:
一、 每次增长一个产品时,都须要增长一个具体类和对象实现工厂,使得系统中类的个数成倍增长,在必定程度上增长了系统的复杂度,同时也增长了系统具体类的依赖。这并非什么好事。
//构造函数(这里就建立了一个Class模板) function Person(name,sex,age){ this.name = name; this.sex = sex; this.age = age; this.run = function(){ console.log("天天坚持跑步"); } } // 实例化 ( new Object()) var person1 = new Person("Tom","man",19); //操做 person1.run();// 天天坚持跑步
// 构造全局的对象 var action = { run:function(){ console.log("天天坚持跑步"); } } //构造函数 funcction(name,sex,age){ this.name = name; this.sex = sex; this.age = age; this.run = action.run; } //实例化 var person1 = new Person("Tom","man",19); person1.run();
分析: 为何要改进构造函数?
咱们都知道当实例化一个对象后,那么这个对象就拥有了模板的属性和方法,
当咱们使用方法时首先会在内存中开辟一份空间,而后在执行相应的操做。假设咱们实例化一万个对象,那么这一万个对象在执行方法时都要在内存中开辟空间,这样只会浪费内存的空间,这时若是能用一个操做代替一万个操做那样岂不是美哉,因此小编这里用了一个全局的对象,即便是一万个对象使用这个方法只会在内存中开辟一份空间。
可是这也有缺点,咱们都知道全局变量和局部变量,全局变量易形成污染而且声明周期比较长,那么全局对象也是同样的,有没有一种方式能够不用所有对象呢?固然有,见下面的第三种建立模式
//构造函数 function Person(name,sex,age){ this.name = name; this.sex = sex; this.age = age; } //使用原型对象 Object.prototype Person.prototype.run = function() { console.log("天天坚持跑步"); } //实例化 var person1 = new Person("Tom","man",19); person1.run();// 天天坚持跑步
首先先明白几个属性:
__proto__: 对象的原型。全部对象都有(包括函数)
prototype:函数的原型对象。只有函数(准确来讲是构造函数)才有
constructor:对象上的一个属性,默认指向这个原型的构造函数