JavaScript碎片—函数闭包(模拟面向对象)


Posted in Javascript onMarch 13, 2019

经过这几天的博客浏览,让我见识大涨,其中有一篇让我感触犹深,JavaScript语言本身是没有面向对象的,但是那些大神们却深深的模拟出来了面向对象,让我震撼不已。本篇博客就是在此基础上加上自己的认知,如有错误,还请见谅。

具体来说实现模拟面向对象主要是利用JavaScript函数闭包这个概念。由于JavaScript中的每一个function都会形成一个作用域,而如果变量声明在这个域中,那么外部是无法直接去访问,要想访问必须new出一个实例来,相当于Java中class。首先让我们来了解一下prototype方法:

1、不使用prototype属性定义的对象方法,是静态方法,只能直接用类名进行调用!另外,此静态方法中无法使用this变量来调用对象其他的属性!
2、使用prototype属性定义的对象方法,是非静态方法,只有在实例化后才能使用!其方法内部可以this来引用对象自身中的其他属性!
Tips :所有的变量,如果不加上var关键字,则默认的会添加到全局对象的属性上去!

具体来说模拟类有以下5种常见写法:

第一种写法:具体介绍见以下代码注释。

function Circle(r) {
    this.r = r;
  }

  Circle.PI = 3.14159;/*Circle.PI属于全局变量 */
  Circle.prototype.area = function() {
    return Circle.PI * this.r * this.r;
  }/*Circle方法调用prototype属性从而能用this调用 Circle方法中的r属性*/

  var c = new Circle(1.0);/* 实例化 Circle*/
  alert(c.area());

第二种写法:与Java类相似,推荐使用!

var Circle = function() { 
    var obj = new Object(); /*先实例化Object方法,使之能调用 obj.PI属性及obj.area方法*/
    obj.PI = 3.14159; 
     
    obj.area= function( r ) { 
      return this.PI * r * r; 
    } 
    return obj; 
  } 
   
  var c = new Circle(); 
  alert( c.area( 1.0 ) );

第三种写法:主要思想是自己先实例化出一个对象,在往这个对象里添加属性及方法

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) );

 第五种写法:此方法与前三种大同小异,不过听说这种写法很少人用,不建议推荐使用哦!!

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());

以上所述是小编给大家介绍的JavaScript函数闭包详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
一端时间轮换的广告
Jun 26 Javascript
通过JAVAScript实现页面自适应
Jan 19 Javascript
jquery下jstree简单应用 - v1.0
Apr 14 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
Nov 08 Javascript
取消选中单选框radio的三种方式示例介绍
Dec 23 Javascript
jquery 取子节点及当前节点属性值的方法
Aug 24 Javascript
jQuery的position()方法详解
Jul 19 Javascript
APP中javascript+css3实现下拉刷新效果
Jan 27 Javascript
javascript实现瀑布流加载图片原理
Feb 02 Javascript
浅析jQuery 遍历函数,javascript中的each遍历
May 25 Javascript
利用js定义一个导航条菜单
Mar 14 Javascript
JavaScript+HTML实现学生信息管理系统
Apr 20 Javascript
详解js动态获取浏览器或页面等容器的宽高
Mar 13 #Javascript
详解jQuery-each()方法
Mar 13 #jQuery
详解使用Nuxt.js快速搭建服务端渲染(SSR)应用
Mar 13 #Javascript
react同构实践之实现自己的同构模板
Mar 13 #Javascript
使用Node.js实现一个多人游戏服务器引擎
Mar 13 #Javascript
你可能不知道的CORS跨域资源共享
Mar 13 #Javascript
react项目如何使用iconfont的方法步骤
Mar 13 #Javascript
You might like
PHP和XSS跨站攻击的防范
2007/04/17 PHP
PHP的mysqli_stat()函数讲解
2019/01/23 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
用 JSON 处理缓存
2007/04/27 Javascript
jquery tools系列 expose 学习
2009/09/06 Javascript
Javascript 中的类和闭包
2010/01/08 Javascript
Dom在ajax技术中的作用说明
2010/10/25 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
常用javascript表单验证汇总
2020/07/20 Javascript
详解基于node.js的脚手架工具开发经历
2019/01/28 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
vue scroll滚动判断的实现(是否滚动到底部、滚动方向、滚动节流、获取滚动区域dom元素)
2020/06/11 Javascript
Python实现简单网页图片抓取完整代码实例
2017/12/15 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
python绘图模块matplotlib示例详解
2019/07/26 Python
python实现字符串和数字拼接
2020/03/02 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
python脚本和网页有何区别
2020/07/02 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
python3.9.1环境安装的方法(图文)
2021/02/02 Python
Gap工厂店:Gap Factory
2017/11/02 全球购物
物流专业毕业生推荐信范文
2013/11/18 职场文书
新任教师自我鉴定
2014/02/24 职场文书
物流管理专业毕业生求职信
2014/03/23 职场文书
文明倡议书范文
2014/04/15 职场文书
运动会演讲稿300字
2014/08/25 职场文书
2014年国庆晚会主持词
2014/09/19 职场文书
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
大学生村官个人总结
2015/02/15 职场文书
2015年医院护理部工作总结
2015/04/23 职场文书
教师培训学习心得体会
2016/01/21 职场文书
2019年第四季度财务部门工作计划
2019/11/02 职场文书
如何理解及使用Python闭包
2021/06/01 Python
从零开始在Centos7上部署SpringBoot项目
2022/04/07 Servers
LeetCode189轮转数组python示例
2022/08/05 Python