JavaScript中的封装

在之前的博客中描述了Java中的面向对象三大特性—封装。由于JavaScript是基于对象的,Java是面向对象的语言,因此这两种语言有着类似的特性,但是在js中没有封装这一概念只能是去模拟封装;


封装

基本理念和Java相同,出于安全性等考虑,将内部的某一属性封装起来,外界不能直接操纵这个属性,只能通过开放的方法进行赋值或者取值;而这个公开的部分就称为对象的界面。
接下来上代码,逐步的了解在js中封装的必要性;
1:阴云密布—–默认正确


    function Person(name,age){
        this.name = name;
        this.age = age;
        this.say = function(){
            console.log(this.name + ":" + this.age);
        }
    }
    var p1 = new Person("lisi",22);
    p1.say();//输出lisi:22

上述代码中定义了一个Person类,中有两个属性和一个方法,在之后的创建对象中赋了两个值,之后调用方法。在这里默认逻辑正确,因此没有任何错误;
2:晴空霹雳——出现问题


    function Person(name,age){
        this.name = name;
        this.age = age;
        this.say = function(){
            console.log(this.name + ":" + this.age);
        }
    }
    var p1 = new Person("lisi",1000);
    p1.say();//输出lisi:1000

此时如果将年龄误输入为1000,那么程序依然会忠诚的将1000输出,而并没有管他符不符合现实要求。
3:回光返照—–逻辑判断

function Person(name,age){
        this.name = name;

        if(age > 100 || age < 0){
            this.age = 18;
        }else{
            this.age = age;
        }

        this.say = function(){
            console.log(this.name + ":" + this.age);
        }
    }
    var p1 = new Person("lisi",1000);
    p1.say();//输出lisi:18

此时在输入age时会进行逻辑判断,如果age不符合就直接赋值18;符合就使用传进来的值;进行到这一步感觉已经解决了这个问题??
3:全面爆发——-功亏一篑

 function Person(name,age){
        this.name = name;

        if(age > 100 || age < 0){
            this.age = 18;
        }else{
            this.age = age;
        }

        this.say = function(){
            console.log(this.name + ":" + this.age);
        }
    }
    var p1 = new Person();
    p1.name = "lisi";
    p1.age = 1000;
    p1.say();//输出lisi:1000

上述代码中我没有在创建Person对象的时候直接传进去参数,我使用的是点符号法,因为age属性此时仍然是Person对象的属性,我依旧可以通过这种方式直接对age进行赋值,直接避开了程序中的逻辑判断!!!!
那岂不是麻了爪?接下来我该怎么办?

4:大道至上——封装奥义

function Person(name){
        this.name = name;
        var age;

        this.getAge = function(){
            if(true){
                return age;
            }else{
                return 18;
            }
        }

        this.setAge = function(num){
            if(num > 100 || num < 0){
                age = num;
            }else{
                age = num;
            }
        };

        this.say = function(){
            console.log(this.name);
        }
    }

    var p1 = new Person("lisi");
    p1.setAge(24);
    p1.say();//输出lisi
    console.log(p1.getAge());//输出24

如上述代码,在Person类中有一个实例化对象属性name。注意这里的age已经不是一个实例化对象属性,也不是类的属性;他是一个使用var声明的变量,而且age的作用域只在function Person中。因此这个age就称之为被封装的属性,而为了让外界一定程度上能够操作age就在function Person内部设置了两个实例化对象函数分别是getAge()和setAge();当Person实例化出对象时,使用p1是无法直接调用age变量的,只能通过实例化函数来进行操作;在这两个函数中又有着相应的逻辑判断;
1:getAge() 在这个方法中需要一个判断法则,看我是否可以直接返回真实年龄,在这里简略的将判断法则设置为通过(true);
2:setAge(num) 在实例化对象调用这个方法时,传入参数,内部有相应的判断逻辑检测age是否符合既定标准;
将一些不想被外界直接操作的属性封装起来,外界没办法直接调用操作,只能通过设置好的界面(实例方法)进行操作,因此极大地保证了安全性也降低了耦合度;


最后的总结

1:js封装的思想和Java封装的思想都是一致的;
2:在js中的function类中使用var修饰一个变量和在Java中使用private修饰一个变量作用是一样的,这个时候外界都没有办法继续调用;
3:js和Java是相通的,不能只为学习一个知识点而学习这个知识点,触类旁通,总结概括,总结思想,找到异同才是最快的方法;
最后的话:
如果你感到焦躁,无助,失望,愤怒。那只有一个原因,你没有去脚踏实地的去做当前的事,沉下心去,做好当前事,别想太多,这才是最快的方式;

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值