走火入魔-javascript 中的类
嗯,没错,今天就是要讲下javascript中的类,哈哈,希望不要对大家有所误解!
稍微对javascript有所了解的人应该知道,javascript这门弱类型语言没有类的概念,它是基于对象的.
看了上面这句不仅有人低估起来了,既然有对象,为啥能没有类呢? 的确,javascript 是一门很怪异的弱类型语言,它的怪异之处以后慢慢讲,而它基于的对象并不是从类实例化过来的对象,而是原型对象.
原型对象从哪来? 用一个不确切的比喻来说好比造物主创造世界的时候初始化了一些原生的东西,比如男人,女人,这是俩个活生生的原型而不是类型,也就是说javascript本身就内置了几种对象,而以后创建的对象都是从这几种内置对象构造函数里初始化出来.
javascript中的原型对象有哪些? 这个准备单独开一篇博来探讨.
上面提到了构造函数,这个东西和类是分不开的 ,那么在创建对象时到底做了什么? 如: var fun=new Function() ;
(1) 首先创建一个新对象,同时在内存开辟了一段存储空间,用来保存 fun 变量的引用地址.
(2)将该对象( fun )的内置原型对象 ( Function ) 设置为 fun 对象 prototype 属性引用的原型对象.
(3)将this 参数调用构造函数,完成成员设置等初始化工作,这是新建对象上的任何操作都和对象自身及其原型链上的那串对象有关,构造函数的使命已经结束,与它再没有任何关系了.
上面说了这么多,既然没有类,为什么还要谈类呢,我们这里说的类是一种模拟,让javascript模拟出强类型面向对象语言的类来.
如何模拟? 其实用到的就是函数嵌套机制,因为在javascript中 一个函数可以包含变量及函数,这样我们就可以把函数的变量模拟成类的属性,而函数的函数就可以模拟成类的方法成员了.
function Person(){ console.log(‘呼吸’); }
假设我们把上面的函数模拟看成一个类,其实他也是自己这个类的构造函数,这是个定义了 人类的模拟类,人类作为一个生命体,共有的特征是呼吸.
那我们就可以根据上面的类创建出对象来了, var Man=new Person();
然后我们调用 Man 这个对象的 constructor 属性,这个属性可以返回创建当前对象的原生对象的引用.
从图中我们可以看出 Man 对象是被对象 Person 创建出来的. 这里你可能有疑问了.Person是被谁创建出来的? 看下面代码
我们的弹出框中显示了 Person 对象的原生对象是 Function ,Function 确实是javascript中的一个内置原生对象,以后我们会单独讲javascript中的原生对象.
好吧,再回到模拟类的话题来,从上面可以看到javascript中的对象是有对象创建,但我们要让他模拟出类的感觉来,那就继续吧,既然说到类,必须有属性方法的.
接着修改上面的Person 对象.
function Person(name){ this.name=name; this.talk=function(){ return this.name +” Speak”; } }
上面这个函数看上去就相当接近一个类了,因为他有变量也有方法,我们接着用Person 构造函数 创建一个Man 对象
var Man=new Person(‘小小’);
把Man对象初始化以后,我们尝试打印出他的属性 name 和 方法 talk(),所以执行下面的语句.
alert(‘姓名:’+Man.name+’,她在干什么?’+Man.talk());
ok,既然讲到了用模拟类,那javascript种是不是也可以有 封装,继承,多态 呢? 或者可以模拟出来呢?后面我博文中单独来讲.