通过这几天的博客浏览,让我见识大涨,其中有一篇让我感触犹深,JavaScript语言自己是没有面向对象的,可是那些大神们却深深的模拟出来了面向对象,让我震撼不已。本篇博客就是在此基础上加上本身的认知,若有错误,还请见谅。闭包
具体来讲实现模拟面向对象主要是利用JavaScript函数闭包这个概念。因为JavaScript中的每个function都会造成一个做用域,而若是变量声明在这个域中,那么外部是没法直接去访问,要想访问必须new出一个实例来,至关于Java中class。首先让咱们来了解一下prototype方法:函数
一、不使用prototype属性定义的对象方法,是静态方法,只能直接用类名进行调用!另外,此静态方法中没法使用this变量来调用对象其余的属性!
二、使用prototype属性定义的对象方法,是非静态方法,只有在实例化后才能使用!其方法内部能够this来引用对象自身中的其余属性!this
Tips :全部的变量,若是不加上var关键字,则默认的会添加到全局对象的属性上去!spa
具体来讲模拟类有如下5种常见写法:prototype
第一种写法:具体介绍见如下代码注释。code
1 function Circle(r) { 2 this.r = r; 3 } 4 5 Circle.PI = 3.14159;/*Circle.PI属于全局变量 */ 6 Circle.prototype.area = function() { 7 return Circle.PI * this.r * this.r; 8 }/*Circle方法调用prototype属性从而能用this调用 Circle方法中的r属性*/ 9 10 var c = new Circle(1.0);/* 实例化 Circle*/ 11 alert(c.area());
第二种写法:与Java类类似,推荐使用!对象
1 var Circle = function() { 2 var obj = new Object(); /*先实例化Object方法,使之能调用 obj.PI属性及obj.area方法*/ 3 obj.PI = 3.14159; 4 5 obj.area= function( r ) { 6 return this.PI * r * r; 7 } 8 return obj; 9 } 10 11 var c = new Circle(); 12 alert( c.area( 1.0 ) );
第三种写法:主要思想是本身先实例化出一个对象,在往这个对象里添加属性及方法blog
var Circle = new Object(); Circle.PI = 3.14159; Circle.Area = function( r ) { return this.PI * r * r; } alert( Circle.Area( 1.0 ) );
第四种写法:该写法跳过new这一步骤,且电脑简单清晰明了,我的推荐这种写法!!继承
var Circle={ "PI":3.14159, "area":function(r){ return this.PI * r * r; } }; alert( Circle.area(1.0) );
第五种写法:此方法与前三种大同小异,不过据说这种写法不多人用,不建议推荐使用哦!!ip
var Circle = new Function("this.PI = 3.14159;this.area = function( r ) {return r*r*this.PI;}"); alert( (new Circle()).area(1.0) );
想必各位朋友都在想既然是模拟面向对象,那是否是得有封装继承,getset方法???答案是确定的,那让咱们来看看以下代码:
封装:在看看以下代码咱们能清晰的了解到封装的使用,倘若咱们去掉 var name = "default"; 中的var,那么结果又是怎么样??答案是与先前同样的,因而可知无var定义的属性只是再其变量做用域中充当全局,只有属性在其做用域中是私有的,若要定义一个私有方法须要将其赋予一个变量充当属性。还有本例中new 可加可不加,若不加可往其后添加()。
var person = function(){ //变量做用域为函数内部,外部没法访问 var name = "default"; return { getName : function(){ return name; }, setName : function(newName){ name = newName; } } }();
alert(person.name);//直接访问,结果为undefined
alert(person.getName());
person.setName("abruzzi");
alert(person.getName());
实现类和继承:该例的主要思想是定义一个变量,将一个方法赋予它,在根据prototype方法将须要继承的类放入其中便可达到继承的效果。。
function Person(){ var name = "default"; return { getName : function(){ return name; }, setName : function(newName){ name = newName; } } }; /* 封装好的一个类Person */ var Jack = function(){}; //继承自Person Jack.prototype = new Person(); //添加私有方法 Jack.prototype.Say = function(){ alert("Hello,my name is Jack"); }; var j = new Jack(); j.setName("Jack"); j.Say(); alert(j.getName());
注: 本贴代码纯属参考各路大神,切不能够转发哦!!!