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

经过这几天的博客浏览,让我见识大涨,其中有一篇让我感触犹深,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()); 

注: 本贴代码纯属参考各路大神,切不可以转发哦!!!

原文地址:https://www.cnblogs.com/zlsh-web/p/10341097.html

时间: 2024-10-15 04:59:55

JavaScript碎片———函数闭包(模拟面向对象)的相关文章

JavaScript的函数闭包使用

一.模仿块级作用域 JavaScript 没有块级作用域的概念,那么可以模拟像java中将很多变量私有化封装起来,保护数据,防止数据泄漏,封装细节,这样安全性和可控性更高 function box(count) { for (var i=0; i<count; i++) { //块级作用域(JS中没有这个东西) } alert(i); //i 不会因为离开了 for 块就失效 } box(2); //结果是2,还是可以访问的 function box(count) { for (var i=0;

JavaScript的函数闭包概念

闭包是指有权访问另一个函数作用域中的变量的函数 一.创建闭包的常见的方式: 就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量. //通过闭包可以返回局部变量 function box() { var user = 'Lee'; return function () { //通过匿名函数返回 box()局部变量 return user; }; } alert(box()()); //通过box()()来直接调用匿名函数返回值 var b = box(); alert(b())

javascript匿名函数 闭包

匿名函数 (function(){                console.info("111111111");            })(); var my = (function(){                return "11111111";            })(); 函数里放匿名函数叫闭包 function my(){                return function(){                    retur

函数闭包模拟session

userlist = [ {'name':'doudou','passwd':'123'}, {'name':'chouchou','passwd':'456'}, {'name':'liuhaiquan','passwd':'789'}, {'name':'liuxue','passwd':'2020'}] current_list = {'username':None,'login':False} #定义一个空的全局变量 def jingdong(yanzheng): def yonghu(

JavaScript匿名函数和闭包

概述 在JavaScript前端开发中,函数与对其状态即词法环境(lexical environment)的引用共同构成闭包(closure).也就是说,闭包可以让你从内部函数访问外部函数作用域.在JavaScript,函数在每次创建时生成闭包.匿名函数和闭包可以放在一起学习,可以加深理解.本文主要通过一些简单的小例子,简述匿名函数和闭包的常见用法,仅供学习分享使用,如有不足之处,还请指正. 普通函数 普通函数由fucntion关键字,函数名,() 和一对{} 组成,如下所示: 1 functi

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

忙里偷闲,简单介绍一下Javascript中匿名函数和闭包函数以及面向对象编程.首先简单介绍一下Javascript中的密名函数. 在Javascript中函数有以下3中定义方式: 1.最常用的定义方式: function functionVal(variable){ return 3*variable; } 2.使用Function构造函数,将函数的参数和函数体内容作为字符串参数[不建议使用]: var objFunction=new Function('variable','return 3

一篇文章把你带入到JavaScript中的闭包与高级函数

在JavaScript中,函数是一等公民.JavaScript是一门面向对象的编程语言,但是同时也有很多函数式编程的特性,如Lambda表达式,闭包,高阶函数等,函数式编程时一种编程范式. function dada() { var a = 1; var b = function() { console.log(a); } return b // b 就是一个闭包函数,因为它能访问dada函数的作用域 } JavaScript的函数也是对象,可以有属性,可以赋值给一个变量,可以放在数组里作为元素

每天一个JavaScript实例-使用带有定时器的函数闭包

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>每天一个JavaScript实例-使用带有定时器的函数闭包</title> <style> #redbox{ position:absolute; left:100px;

JavaScript进阶系列01,函数的声明,函数参数,函数闭包

本篇主要体验JavaScript函数的声明.函数参数以及函数闭包. □ 函数的声明 ※ 声明全局函数 通常这样声明函数: function doSth() { alert("可以在任何时候调用我"); } 通过这种方式声明的函数属于Window对象,可以在任何地方调用,即在doSth方法的之前和之后都可以调用. 可以在doSth方法之前调用: doSth(); function doSth() { alert("可以在任何时候调用我"); } 可以在doSth方法之