其实学了这么久的javascript一直都困扰着面向对象编程这个概念,其实虽然我们不理解,但是实际上我们工作的平时,无时无刻不接触者面向对象,并给我们提供了各种便利。
例如我们用的JSON数据传输格式,其实就是一种将数组、字符串、属性、方法 等多种元素融合在一起的东西,比如我们平时编写的function函数,也是一种对象。
其实我们可以这么理解,何为对象?
1、函数的存在,就是一个相对抽象的可重用性较高的程序模版,那么可以减免,我们在程序中去编写重复的代码,我们可以将 功能相同的部分,编写出一套模版;
2、相对而言的,对象以如此,对象就是一种高度集合的组织方式,我们可以通过继承的方式,来调用它,一切 的一切一个“.”就可以搞定
其实javascript中大概可分为以下一种对象
1、Function对象=====================>可以分为两种1、作为Funtion的实例,可以使用参数来调用,例如 alert()方法
2、作为构造函数的Function对象,必须通过new操作符来进行实例化
2、object对象======================>格式一般为 var a=new Object();
3、内置对象=======================>例如Math Number String Array RegExp Boolean Date等都有内置的方法,他们使用的方法,都要先通过new操作符来进行实例化
PS:讲解俩概念 实例和实例化
什么是实例化?可以理解为,万物总有一个根本,假如人都是女娲造的,那么我们每个人都具有能走能跳能动能跑的能力,那么这些都是女娲赋予我们的,那么每当我们想创造一个新的人的时候,也就是new出来一个人,必须去从根本上去寻找他;
类型于 var 新人=new 女娲();那么同样实例化的意思就是,通过像源头的对象进行实例化操作来创建的一个实例,比如说var a=new Array();Array底层存在有length属性,存在有push slice join splice等方法,那么通过new Array这个源头的对象,就能创造出一个和它拥有同样能力的副本,并且继承了他的所有属性和方法。
PS:同样我们要根据这个来理解一个概念,一个实例是不能再进行实例化的,一切都要从源头进行实例化,比如说 var a=new Array();是正确的,但是你在通过 a进行实例化 var b=new a,那就会报错
javascript给我们提供了很多内置的对象,让我么可以自由的操控其中的属性和方法,但是js的灵魂其实是自定义创建的对象,也就是 通过Object创建的对象,进行面向对象编程。
最简单的创建对象的方法就是:
var a=new Object();或者var a={};
其实通过深入理解的时候,你也许会慢慢明白,其实object和array等内置对象其实一样,只不过array被赋予了属性和方法,所以仅仅创建一个对象没有任何意义,里面的一切都是空的,一切东西都需要你去添加。所以我们要学会向其中添加属性和方法
a.age=23;
a.say=function(){
alert(this.age);
},那么这种创建出来的属性和方法是静态的,日后我们会讲解,这些是无法继承的。
但是之前我们也说过“对象就是一种高度集合的组织方式,我们可以通过继承的方式 来调用它“,那么着需要引入构造函数的概念
Function对象的构造函数有一个不同于其他对象的特点:它的实例也可以作为构造器方法(即源头),因为可以用来创建函数的新实例(即我们可以new它)
这是一个非常重要的特性,我们可以根据这个特性,完成我们想要的继承功能
比如:
var a=function(msg){alert(this.msg);this.msg=msg;}<==>等价于function a (){}<==>等价于 var a=new Function() //( 但是最后这个有性能问题,所以一般我们通过前面两种来进行实例化)
那么当我们以a为源头 创建b这个实例的时候,即 var b=new a("lyl");那么这个是合法的,并且会立即执行,同时还为b添加了一个新的属性即msg,我们可以通过b.msg来读到它,
但是需要注意到的就是,这个属性值只有被它实例化过的实例对象才能读取,其本身无法读取,始终都是弹出undefined!