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

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

1、不使用prototype属性定义的对象方法,是静态方法,只能直接用类名进行调用!另外,此静态方法中无法使用this变量来调用对象其他的属性!

2、使用prototype属性定义的对象方法,是非静态方法,只有在实例化后才能使用!其方法内部可以this来引用对象自身中的其他属性!

Tips :所有的变量,如果不加上var关键字,则默认的会添加到全局对象的属性上去!

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

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

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

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

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

matlab中circle函数_JavaScript碎片——函数闭包(模拟面向对象)相关推荐

  1. matlab中load seamout,matlab中的save与load函数

    matlab中的save与load函数 用save函数,可以将工作空间的变量保存成txt文件或mat文件等. 比如: save peng.mat p j 就是将工作空间中的p和j变量保存在peng.m ...

  2. 邹检验 matlab,科学网—Matlab中一个很有用的函数:regionprops - 邹兴文的博文

    Matlab中一个很有用的函数:regionprops 已有 6712 次阅读 2010-1-30 22:52 |个人分类:开发经验|系统分类:科研笔记| 有用的函数, regionprops Mat ...

  3. 函数调用matlab,Matlab中一个函数调用另外一个函数的操作方法

    这篇文章为各位带来的内容是Matlab中一个函数调用另外一个函数相关的,对此感兴趣的用户可以去下文看看Matlab中一个函数调用另外一个函数的操作教程. Matlab中一个函数调用另外一个函数的操作方 ...

  4. matlab怎么调用主函数,Matlab中一个函数调用另外一个函数的操作步骤

    原创Matlab中一个函数调用另外一个函数的操作步骤 编辑:小安 来源:PC下载网时间:2019-11-18 13:27:35 最近很多伙伴才刚刚安装入手Matlab这款软件,而本节就重点介绍了关于M ...

  5. Matlab中用于数据预测spline()函数的使用

    Matlab中用于数据预测spline()函数的使用 ​ 再matlab中spline函数是利用三次方样条数据插值 语法 s = spline(x,y,xq) pp = spline(x,y) s = ...

  6. Matlab中产生正态分布随机数的函数normrnd-----用来产生高斯随机矩阵

     Matlab中产生正态分布随机数的函数normrnd-----用来产生高斯随机矩阵 功能:生成服从正态分布的随机数 语法: R=normrnd(MU,SIGMA) R=normrnd(MU,SI ...

  7. Matlab中print, fprint, fscanf, disp函数的用法

    最近一直在用python,导致学习的一些函数就有点混淆,趁着这会儿看代码,就再回顾下Matlab中print, fprint, fscanf, disp函数的用法 一.print() 函数可以把函数图 ...

  8. MATLAB中的varargin,varargout在函数中运用

    varargin,表示用在一个函数中,输入参数不确定的情况,这增强了程序的灵活性.               例如:function g=fun(f,varargin)               ...

  9. matlab 中关于nargin 以及 varargin 函数的使用

    最近自己在学matlab function过程当中对于 varargin函数的使用有了疑惑 于是结合自己所看的教学以及搜集到的资料对于这两个函数的理解 nargin: number of functi ...

最新文章

  1. java对象--内部类
  2. 网站优化人员必须具备的几个工作原则
  3. 机器学习中的评价指标--1[F,P,R]
  4. 遗传算法 差分进化算法 粒子群优化算法区别
  5. LeetCode:922. 按奇偶排序数组 II
  6. android相关论文,android
  7. HIVE: hive.error.on.empty.partition
  8. Ubuntu 安装DELL D630无线网卡驱动
  9. android kl文件
  10. fclose用法matlab,fclose和close之间的区别
  11. 为植物种子备份 “末日种子库”收集样本逾百万
  12. Python3对股票数据进行分析
  13. wds和extap作为cpe区别
  14. Roaring 20s(还有一些《A ConvNet for the 2020s》读后感)
  15. html分列代码,科学网—EXCEL 分列 (TextToColumns) 的C#代码 - 丁祥欢的博文
  16. 5个主流的HTML5开发工具
  17. 我是如何被快捷键折腾的
  18. 好记性不如烂笔头The palest ink is better than the best memory
  19. 使用WSAIoctl获取socket扩展函数(如AcceptEx)的指针
  20. MATLAB演示元胞自动机算法

热门文章

  1. TypeScript 2.0开启空值的严格检查
  2. OpenHarmony移植案例与原理:如何适配服务启动引导部件bootstrap_lite
  3. 一文讲述G6实现流程图绘制的常用方法
  4. 带你认识大模型训练关键算法:分布式训练Allreduce算法
  5. 关于【微服务】,你必须了解这些
  6. 【华为云技术分享】《跟唐老师学习云网络》— iptables - filter过滤功能
  7. 多元算力加持,华为云鲲鹏大数据服务公测上线
  8. 【Python3网络爬虫开发实战】 3.1.3-解析链接
  9. php socket 实现ftp,用socket实现FTP教程
  10. 红橙Darren视频笔记 view的invalidate调用draw方法的流程(源码分析基于api 29)