初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,由于JS是没有类的概念的,可是这并不表明JavaScript没有对象的存在,并且JavaScript也提供了其它的方式来解决面向对象的问题。因此JavaScript也是一门面向对象的语言。编程
面向对象仅仅是一个概念或者编程思想而已,它不该该依赖于某个语言存在。好比 PHP采用面向对象思想构造其语言,它实现了类、继承、派生、多态、接口等机制。可是这些机制,只是实现面向对象编程的一种手段,而非必须。换言之,一门语言能够根据其自身特性选择合适的方式来实现面向对象。于是先入为主地接受了"类"这个面向对象实现方式。函数
JavaScript不一样于其它语言,它是经过原型(prototype)的方式来实现面向对象编程的,也就是说对象(object)是依靠构造器(constructor)利用原型(prototype)构造出来的,而有时也称它为伪类。post
下面说一下面向对象的实现方式,为了好理解,咱们借鉴其它语言中类和对象的思想来简单分析一下:学习
一:最简单的面向对象(即便用JSON方式来声明)this
定义一个伪类:spa
var Ren = { name:"张三", //至关于成员变量 sex:"男", //至关于成员变量 age:18, //至关于成员变量 say:function(){ //至关于成员方法 alert("讲话"); } };
调用类里面的成员:prototype
Ren.say();
经过上面的例子能够看出来,该类里面的成员至关于其它语言里面的静态成员,经过类名调用。
这种方式基本能够知足开发的需求,可是相对于其它语言来讲没有实现封装、继承和多态,因此代码的重用性比较差。code
二:使用原型的方式(函数构造器)对象
定义一个类:blog
function Ren(){ var name="张三"; //私有的成员变量 var sex ="男"; //私有的成员变量 this.PublicName="zhangsan", //公有的成员变量 this.setName = function(_name){ //成员方法 name=_name; } this.getName = function(){ //成员方法 return name; } }
造对象而且调用对象的成员:
var r = new Ren(); r.getName();
在建立对象的时候,会运行相似于这样的代码,使用构造器来建立对象:
this.prototype = {constructor: this}
函数的prototype的属性的值被做为原型对象来克隆出新对象。
虽然使用new运算符调用函数看起来像是使用模板实例化的方式来建立对象,但本质仍是以原型对象来克隆出新对象,目前咱们看它像是一个类,但还有一点就是每new Ren(),不但属性产生副本,方法也会产生副本。
若是不想让方法产生复本,它提供了prototype这个属性,即原型。全部实例都会共享它里面的属性和方法。
能够在定义对象的时候:把属性放到定义里,而把对象的方法放到原型里!
以下:
function Ren(name, age) { this.name = "张三"; this.age = 18; }; Ren.prototype.say = function(){ //方法放在原型里面 alert("hello"); };
调用该成员方法:
var r = new Ren(); r.say();
以上两种方式均可以实现JavaScript中的面向对象,实际上每种语言的面向对象思想都是一致的,只是方法有所不一样而已,在JavaScript这门强大的语言里面依然是有面向对象存在的只是咱们学习了其它语言的面向对象以后,有种先入为主的感受,对JavaScript的面向对象产生疑惑,因此必定谨记面向对象是一种思想,不是一种方法。
转自李老师!