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

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
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类相似,推荐使用!

?
1
2
3
4
5
6
7
8
9
10
11
12
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 ) );

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

?
1
2
3
4
5
6
7
var Circle = new Object();
Circle.PI = 3.14159;
Circle.Area = function( r ) {
    return this.PI * r * r;
}
  
alert( Circle.Area( 1.0 ) );

第四种写法:该写法跳过new这一步骤,且电脑简单清晰明了,个人推荐这种写法!!

?
1
2
3
4
5
6
7
var Circle={
      "PI":3.14159,
     "area":function(r){
         return this.PI * r * r;
        }
    };
    alert( Circle.area(1.0) );

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

?
1
2
3
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 可加可不加,若不加可往其后添加()图片切换

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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方法将需要继承的类放入其中即可达到继承的效果。。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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碎片—函数闭包(模拟面向对象)的更多相关文章

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

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

  2. JavaScript的函数闭包详细解释

    闭包是指有权访问另一个函数作用域中的变量的函数 一.创建闭包的常见的方式: 就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量. //通过闭包可以返回局部变量 function b ...

  3. javascript匿名函数 闭包

    匿名函数 (function(){                console.info("111111111");            })(); var my = (fun ...

  4. 函数闭包模拟session

    根据上一个认证功能的问题 要解决的就是只需要登录一次 也就是登录一次之后的用户名跟密码可以保存下来让其他函数用-->全局变量 user_dic = {"user_name": ...

  5. 了解Javascript中函数作为对象的魅力

    前言 Javascript赋予了函数非常多的特性,其中最重要的特性之一就是将函数作为第一型的对象.那就意味着在javascript中函数可以有属性,可以有方法, 可以享有所有对象所拥有的特性.并且最重 ...

  6. 深入理解javascript原型和闭包(2)——函数和对象的关系

    上文(理解javascript原型和作用域系列(1)——一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; co ...

  7. 简单介绍Javascript匿名函数和面向对象编程

    忙里偷闲,简单介绍一下Javascript中匿名函数和闭包函数以及面向对象编程.首先简单介绍一下Javascript中的密名函数. 在Javascript中函数有以下3中定义方式: 1.最常用的定义方 ...

  8. 第一百一十节,JavaScript匿名函数和闭包

    JavaScript匿名函数和闭包 学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂 ...

  9. 深入理解javascript原型和闭包(2)——函数与对象的关系

    上文(理解javascript原型和作用域系列(1)——一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; co ...

随机推荐

  1. Javascript高级编程学习笔记(46)—— 选择符API

    选择符API 在DOM1中DOM只提供了 getElementById.getElementsByTagName 两种获取文档元素的方法 很多时候这两种方法往往不能较为方便地获取我们所需要的元素 所以 ...

  2. (爬虫向)python_json学习笔记

    JSON学习笔记 - 在线工具 - https://www.sojson.com/ - http://www.w3school.com.cn/json/ - http://www.runoob.com ...

  3. prompt的工作原理

    浏览器提供了一个内置函数,可以用来获取用户输入:这个函数就是prompt.函数prompt与你使用过的函数alert很像(它也显示一个对话框,其中包含你指定的字符串),但它还提供了让用户输入响应的区域 ...

  4. FF中flash滚轮失效的解决方案

    概述 在FF浏览器中有这样一个bug,就是当鼠标hover在flash区域的时候,滚轮会失效.原因是ff浏览器没有把滚轮事件嵌入到flash里面去.如果这个flash很小的话,比如直播的视频,会很容易 ...

  5. 《http权威指南》读书笔记6

    概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...

  6. Kali学习笔记37:APPSCAN

    APPSCAN是一款商业Web扫描器,被IBM公司收购 功能和AVWS.Burp类似,不过界面更加简单 APPSCAN的使用比Burp等开源软件要简单很多 所以我这里写得内容比较少,不过它的功能还是很 ...

  7. CoCos2dx开发:中文乱码

    一.FontToUTF8()方法修改字体: 1.HelloWorldScene.h头文件中声明方法: char* FontToUTF8(const char* font); 2.HelloWorldS ...

  8. python函数学习1

    函数1 (1)定义: def 函数名(参数列表) 函数体 (2)参数传递: 在python中,一切都是对象,类型也属于对象,变量是没有类型的. a = [1,2,3] a = "hellow ...

  9. 微信小程序开发-第一弹

    前言:       本篇文章为大家详细介绍微信小程序开发第一篇,后续步骤会逐步更新,欢迎大家关注. 第一步  注册        1.1 打开网址 https://mp.weixin.qq.com/  ...

  10. Android--通知之Notification

    前言 之前一篇博客讲了Android下使用Toast的方式提示消息.这篇博客讲解一下在Android中使用Notification提示消息给用户,Notification是一种具有全局效果的通知,程序 ...