美文网首页
JavaScript-10 封装性

JavaScript-10 封装性

作者: 想成为大牛的程旭元 | 来源:发表于2020-10-13 15:20 被阅读0次
    1. 局部变量和局部函数
      无论是ES6之前还是ES6, 只要定义一个函数就会开启一个新的作用域
      只要在这个新的作用域中, 通过let/var定义的变量就是局部变量
      只要在这个新的作用域中, 定义的函数就是局部函数

    2. 什么是对象的私有变量和函数
      默认情况下对象中的属性和方法都是公有的, 只要拿到对象就能操作对象的属性和方法
      外界不能直接访问的变量和函数就是私有变量和是有函数
      构造函数的本质也是一个函数, 所以也会开启一个新的作用域, 所以在构造函数中定义的变量和函数就是私有和函数

    function Person() {
       this.name = "lnj";
        // this.age = 34;
       let age = 34;
       this.setAge = function (myAge) {
            if(myAge >= 0){
                 age = myAge;
             }
        }
       this.getAge = function () {
            return age;
        }
       this.say = function () {
          console.log("hello world");
       }
    }
    let obj = new Person();
    obj.setAge(-3);
    console.log(obj.getAge())
    
    像上面的代码,在构造函数里面,let了一个临时变量,外部只能通过setAge和getAge来访问和操作age变量,直接console.log(obj.age);会直接报错。
    
    1. 什么是封装?
      封装性就是隐藏实现细节,仅对外公开接口

    2. 为什么要封装?
      4.1 不封装的缺点:当一个类把自己的成员变量暴露给外部的时候,那么该类就失去对属性的管理权,别人可以任意的修改你的属性
      4.2 封装就是将数据隐藏起来,只能用此类的方法才可以读取或者设置数据,不可被外部任意修改. 封装是面向对象设计本质(将变化隔离)。这样降低了数据被误用的可能 (提高安全性和灵活性)

    3. 结论: 默认情况下对象的属性和方法都是公开的, 只要拿到对象就可以操作对象的属性和方法

    1. 在给一个对象不存在的属性设置值的时候, 不会去原型对象中查找, 如果当前对象没有就会给当前对象新增一个不存在的属性
    2. 由于私有属性的本质就是一个局部变量, 并不是真正的属性, 所以如果通过 对象.xxx的方式是找不到私有属性的, 所以会给当前对象新增一个不存在的属性
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>私有属性注意点</title>
        <script>
            function Person() {
                this.name = "lnj";
                let age = 34;
                this.setAge = function (myAge) {
                    if (myAge >= 0) {
                        age = myAge;
                    }
                }
                this.getAge = function () {
                    return age;
                }
                this.say = function () {
                    console.log("hello world");
                }
            }
            let obj = new Person();
            // 1.操作的是私有属性(局部变量)
            obj.setAge(-3);
            console.log(obj.getAge());
    
            /*
            // 注意点:
            // 在给一个对象不存在的属性设置值的时候, 不会去原型对象中查找, 如果当前对象没有就会给当前对象新增一个不存在的属性
            // 由于私有属性的本质就是一个局部变量, 并不是真正的属性, 所以如果通过 对象.xxx的方式是找不到私有属性的, 所以会给当前对象新增一个不存在的属性
            */
            // 2.操作的是公有属性
            obj.age = -3;
            console.log(obj.age);
    
        </script>
    </head>
    <body>
    
    </body>
    </html>
    
    在JavaScript中属性和方法分类两类
    1. 实例属性/实例方法
    • 在企业开发中通过实例对象访问的属性, 我们就称之为实例属性
    • 在企业开发中通过实例对象调用的方法, 我们就称之为实例方法
    function Person() {
      this.name = "lnj";
      this.say = function () {
            console.log("hello world");
       }
    }
     // 通过构造函数创建的对象, 我们称之为"实例对象"
    let obj = new Person();
    console.log(obj.name);
    obj.say();
    
    1. 静态属性/静态方法
    • 在企业开发中通过构造函数访问的属性, 我们就称之为静态属性
    • 在企业开发中通过构造函数调用的方法, 我们就称之为静态方法
    function Person() {
      this.name = "lnj";
      this.say = function () {
            console.log("hello world");
       }
    }
    // 构造函数也是一个"对象", 所以我们也可以给构造函数动态添加属性和方法
    Person.num = 666;
    Person.run = function () {
        console.log("run");
    }
    console.log(Person.num);
    Person.run();
    

    相关文章

      网友评论

          本文标题:JavaScript-10 封装性

          本文链接:https://www.haomeiwen.com/subject/hosvpktx.html